Oauth 2 не может обменять код на токен доступа, возвращает «invalid_grant» - PullRequest
4 голосов
/ 18 февраля 2012

Я обнаружил, что могу аутентифицироваться через OAuth 2.0, когда мой URI перенаправления имеет вид «urn: ietf: wg: oauth: 2.0: oob», НО пользователь вынужден скопировать код, затем вернуться к одному действию и вставить это в поле. Я хочу, чтобы опыт был более элегантным. Когда URI перенаправления имеет вид "http://localhost", (даже если возвращен код доступа), я не могу обменять его на токен доступа к API. Вот мой код обмена:

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                    0);
            nameValuePairs.add(new BasicNameValuePair("client_id",
                    OAuth2ClientCredentialsMark1.CLIENT_ID));
            nameValuePairs.add(new BasicNameValuePair("client_secret",
                    OAuth2ClientCredentialsMark1.CLIENT_SECRET));
            nameValuePairs.add(new BasicNameValuePair("code", accessCode));
            nameValuePairs.add(new BasicNameValuePair("grant_type",
                    "authorization_code"));
            nameValuePairs.add(new BasicNameValuePair("redirect_uri",
                    OAuth2ClientCredentialsMark1.REDIRECT_URI));
                    //"http://localhost"

            String url = "https://accounts.google.com/o/oauth2/token";
            //url += URLEncodedUtils.format(nameValuePairs, "utf-8");

            Log.d("print", url);
            HttpPost hPost = new HttpPost(
                    url);
            hPost.setHeader("content-type", "application/x-www-form-urlencoded");

            hPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Этот код всегда возвращает {"error": "invalid_grant"} Что дает?

Мое приложение основано на образце @ https://github.com/ddewaele/LatitudeOAuth2Sample, и я следую учебному пособию @ http://code.google.com/apis/accounts/docs/OAuth2InstalledApp.html

Ответы [ 3 ]

3 голосов
/ 12 апреля 2012

Кажется, ваш код правильный.Ошибка поступает из спецификации раздела OAuth2-5.2 .

Предоставленный грант авторизации (например, код авторизации, учетные данные владельца ресурса) или токен обновления недействителен, просрочен, отозван, делаетне соответствует URI перенаправления, который использовался в запросе авторизации или был выдан другому клиенту.

Скорее всего, ваше приложение еще не было авторизовано пользователем .


Чтобы ответить на ваше беспокойство по поводу:

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

Не могли бы вы уточнить, что за поток oauth2 (сценарий) , вы разрабатываете?

1 голос
/ 30 ноября 2012

Как предполагает следующий поток, это может быть ошибка ВРЕМЕНИ.Обеспечение синхронизации вашего сервера с мировыми часами может просто предотвратить эту ошибку invalid_grant.

У меня была эта проблема только на одном из моих серверов, и действительно, это была единственная проблема с отключением на 40 секунд.мировые часы (это было в будущем).Я использовал ntpdate для принудительного изменения даты и установил сервис ntp.Это окно Linux.

https://groups.google.com/forum/?fromgroups=#!topic/google-analytics-data-export-api/4uNaJtquxCs

0 голосов
/ 21 мая 2012
{
  "access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}

Вы получаете это выше, когда впервые пытаетесь получить access_token для своего приложения. И через час после истечения срока действия вашего токена доступа вы можете получить новый access_token с помощью refresh_token .... вот ваша ссылка для этого https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token

...