Google Data Api возвращает неверный токен доступа - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь вытащить список контактов из гугл аккаунта.Но Google возвращает 401.

URL-адрес, используемый для запроса кода авторизации:

String codeUrl = 'https://accounts.google.com/o/oauth2/auth' + '?'
           + 'client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8')
           + '&redirect_uri=' + EncodingUtil.urlEncode(MY_URL, 'UTF-8')
           + '&scope=' + EncodingUtil.urlEncode('https://www.google.com/m8/feeds/', 'UTF-8')
           + '&access_type=' + 'offline'
           + '&response_type=' + EncodingUtil.urlEncode('code', 'UTF-8')
           + '&approval_prompt=' + EncodingUtil.urlEncode('force', 'UTF-8');

Обмен возвращенного кода авторизации на токен доступа (и токен обновления):

String params = 'code=' + EncodingUtil.urlEncode(authCode, 'UTF-8')
              + '&client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8')
              + '&client_secret=' + EncodingUtil.urlEncode(CLIENT_SECRET, 'UTF-8')
              + '&redirect_uri=' + EncodingUtil.urlEncode(MY_URL, 'UTF-8')      
              + '&grant_type=' + EncodingUtil.urlEncode('authorization_code', 'UTF-8');  

Http con = new Http();
Httprequest req = new Httprequest();
req.setEndpoint('https://accounts.google.com/o/oauth2/token');
req.setHeader('Content-Type', 'application/x-www-form-urlencoded');                   
req.setBody(params);
req.setMethod('POST');
Httpresponse reply = con.send(req); 

, который возвращает массив JSON с тем, что выглядит как действительный токен доступа:

{ 
    "access_token" : "{access_token}", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "{refresh_token}" 
} 

Однако, когда я пытаюсь использовать токен доступа (либо в коде, либо в curl), Google возвращает 401:

curl -H "Authorization: Bearer {access_token}"  https://www.google.com/m8/feeds/contacts/default/full/

Между прочим, работает та же команда curl, но с токеном доступа, полученным через https://code.google.com/oauthplayground/.Что приводит меня к мысли, что с обменом кода авторизации для запроса токена доступа что-то не так, поскольку возвращенный токен доступа не работает.

Я должен добавить, что все это в пределах периода expires_in, так что access_token не истек

1 Ответ

0 голосов
/ 02 апреля 2012

Хорошо, поэтому проблема была в области при запросе кода авторизации.Я случайно установил область действия https://www.google.com/m8/feeds/contacts/default/full (URL для получения всех контактов), опасности позднего ночного кодирования.По иронии судьбы, в качестве примера в вопросе использовался правильный жестко запрограммированный URL, в котором не было ошибки.Я оставлю вопрос в надежде, что те, у кого возникла подобная проблема, найдут его и код в вопросе сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...