Google Data Api возвращает недопустимый токен доступа
Я пытаюсь вывести список контактов из учетной записи google. Но 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}"
}
Однако, когда я пытаюсь использовать токен доступа (либо в коде или завитке), 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 истек.
Хорошо, поэтому проблема была в области при запросе кода авторизации. Я случайно установил область https://www.google.com/m8/feeds/contacts/default/full (URL-адрес для извлечения всех контактов), опасности позднего ночного кодирования. Как ни странно, в качестве примера в вопросе использовался правильный код с жестким кодированием, у него не было ошибки. Я оставлю вопрос в надежде, что те, у кого есть аналогичная проблема, найдут его, и код в вопросе будет работать.
Похожие вопросы
Посмотрите другие вопросы по меткам java oauth oauth-2.0 или Задайте вопрос