2017-01-02 7 views
1

Я получаю действительный код на стороне входа в систему моего приложения, используя модуль urularJS Oauth GAuth.checkAuth(). а затем GAuth.getToken().Google OAuth, возвращающий invalid_grant Неверный тип токена

Код действителен только в течение 1 часа, и любой API, такой как GoogleDocs, Gmail, доступ к которому осуществляется через 1 час, терпит неудачу и нуждается в переустройстве.

Чтобы преодолеть это, я пытаюсь отправить код на сервер для получения AccessCode на сервере, так что я могу отправить же с просьбами GoogleDocs, Gmail и т.д.

GoogleAuthorizationCodeTokenRequest req = 
new GoogleAuthorizationCodeTokenRequest(
    new NetHttpTransport(), 
    JacksonFactory.getDefaultInstance(), 
    "https://www.googleapis.com/oauth2/v4/token", 
    // "https://accounts.google.com/o/oauth2/token", 
    "901142925530-21ia7dqnsdsdsndnsnnnfdc9cm2u07.apps.googleusercontent.com", 
    "6NSvw0efghyuuG8YGOBWPln79n", 
    authCode, 
    "http://localhost:8080"); 
req.setGrantType("authorization_code"); 
//req.put("refresh_token", authCode); 
//req.put("access_type", "offline"); 
GoogleTokenResponse tokenResponse = 
req.execute(); 

tokenResponse.getAccessToken() 

Где AUTHCODE код, который я получил в GAuth Токен

Но вызов не удается, и в ответ я получаю

400 Bad Request 
{ 
    "error" : "invalid_grant", 
    "error_description" : "Incorrect token type." 
} 

Любая помощь высоко ценится!

+0

Почему вы не используете обновления маркер на клиентская сторона? –

+0

Я читал API, и он сказал, что токен обновления не работает на стороне клиента. Так что он не потратил много времени на изучение этого. Можно ли использовать его на стороне клиента? Не могли бы вы сообщить мне шаги? –

ответ

0

Когда пользователь сначала аутентифицирует ваше приложение, вам предоставляется авторизационный код. Затем вам необходимо взять этот код авторизации и обменять его на токен доступа и токен обновления. После использования авторизационного кода его нельзя использовать снова.

grant_type = authorization_code

Обозначает, что вы просите Google, чтобы verifiy, что ваш код авторизации и дать вам новый маркер доступа и обновления маркера.

Мне кажется, что вы берете либо токен доступа, возвращенный из этого запроса, и отправляете его в конечную точку grant_type = authorization_code, которая не будет работать с неправильным типом кода. Куры ошибка вы получаете из

400 Bad Request { "ошибка": "invalid_grant", "error_description": "Некорректного маркера типа." }

Вам нужно будет взять токен обновления, который вы даете. Если есть один, я не уверен, что вы даже можете получить токен обновления от AngularJs. Вы можете получить один, используя java.

обновлённый маркера доступа в чистом отдыхе будет выглядеть следующим образом

https://accounts.google.com/o/oauth2/token 
    client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token 

Обратите внимание на &grant_type=refresh_token. Если вы используете клиентскую библиотеку Google api java, она должна обрабатывать все это для вас. Однако ваши теги немного запутывают его непонятное, если вы пытаетесь сделать это в java или angularjs, которые, как я считаю, позволят вам использовать токены обновления. Опять я не угловатый dev, я мог ошибаться по этому поводу.

Anwser:

вам код, который вы отправляете не код авторизации. Только код авторизации может быть отправлен в grant_type = authorization_code.Решение: Отправить письмо authorization_code

Типы кодов Google и лексем:

Есть три типа кодов или маркеров вы должны быть в курсе с oauth2.

  1. Код авторизации.
  2. Обновить маркер
  3. маркера доступа

При запросе доступа пользователя, и они предоставляют вам доступ приложения вам предоставляется Authorization code. Код авторизации недолговечен, вероятно, менее 10 минут, и его можно использовать только один раз.

Код авторизации используется для получения маркера первичного доступа и токена обновления с сервера аутентификации googles. используя grant_type=authorization_code

Токен доступа хорош около часа. Они используются для звонков на Google API,

https://www.googleapis.com/plus/v1/people/me?access_token={your access token} 

Вы можете использовать маркер доступа, как часто, как вы хотите в течение этого часа если вы не сдуть некоторую квоту.

Обновить токены используются для запроса нового токена доступа с сервера проверки подлинности Google, когда токен доступа, который у вас есть, истек или вы просто хотите новый. здесь grant_type=refresh_token используется для запроса нового токена доступа, который вы по существу говорите в Google. Я посылаю вам токен обновления, который вы знаете, что делать.

дополнительное чтение

У меня есть купе учебники, которые могут помочь вам Google 3 Legged OAuth2 Flow и Google Developer Console Oauth2 credentials

Также полезно при изучении OAuth: The OAuth 2.0 Authorization Framework

+0

Спасибо! Извините, но мое предположение состояло в том, что когда я вхожу в систему через JAPI/AngularJS, я получаю код авторизации и отправляю сервер для обмена. Не могли бы вы объяснить мне разницу между токеном доступа и кодом авторизации, указанным в ваших первых 2 абзацах. Может быть, это поможет мне. Поэтому в основном я выполняю аутентификацию на стороне клиента, используя GAPI (And AngularJS), и пытаюсь получить код доступа на стороне сервера для повторного использования. Так как Ours - это веб-приложение, оно стало более возможным. Вы предлагаете выполнить проверку подлинности на стороне сервера? –

+0

У меня есть учебное пособие, в котором объясняется поток Oauth в необработанных HTTP-вызовах. http://www.daimto.com/google-3-legged-oauth2-flow/. Вы должны проходить аутентификацию на стороне сервера, а не на стороне клиента. Я не уверен, что Gapi даст вам токен обновления, который вы можете использовать , – DaImTo

+0

Еще раз спасибо! Но у меня возникают такие сомнения. Как мы выполняем аутентификацию на сервере? Он интегрирован с веб-браузером, и запрос напрямую переходит на сервер google. Google не позволит нам (или не будет разумным, даже если это выполнимо), чтобы хранить учетные данные пользователя на нашем сервере. В настоящее время открывается новое окно Google, и при аутентификации мы получаем код доступа в функции обратного вызова. –

 Смежные вопросы

  • Нет связанных вопросов^_^