2017-01-02 23 views
1

私は、アプリケーションのクライアントサイドログインで、angularJS OauthモジュールGAuth.checkAuth()を使用して有効なコードを取得しています。 GAuth.getToken()を呼び出します。Google OAuth returns invalid_grant不正なトークンタイプ

コードは1時間しか有効ではなく、GoogleDocsのようなAPI、1時間後にアクセスしたGmailは失敗し、再ログインが必要です。私はGoogleDocsにリクエストして、同じ送信できるように、サーバーでAccessCodeを取得するために、サーバーにコードを送信しようとしていますこの、Gmailのなど

AUTHCODEは私が受け取ったコードである
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() 

を克服するために

GAuthトークン

しかし、呼び出しが失敗しているし、それに応答して、私はすべてのヘルプは高く評価されて

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

を入手!

+0

を使用すると、トークンのリフレッシュを使用していないなぜクライアント側? –

+0

私はAPIを読んでいましたが、リフレッシュトークンはクライアントサイドでは機能しませんでした。それを調べるのに多くの時間を費やしていませんでした。クライアント側で使用することは可能でしょうか?手順を教えてもらえますか? –

答えて

0

ユーザーが最初にアプリケーションを認証すると、認証コードが与えられます。この認証コードを取得し、アクセストークンと更新トークンを交換する必要があります。認証コードが使用されると、再度使用することはできません。

grant_type = authorization_code

あなたがその認証コードをverifiy、あなたに新しいアクセストークンとリフレッシュトークンを与えるためにGoogleを求めていることを示します。

そのリクエストから返されたアクセストークンを取得し、間違ったタイプのコードを動作させないgrant_type = authorization_codeエンドポイントに送信しているようです。鶏あなたは

400不正な要求{ "エラー" で取得しているエラー: "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でこれをしようとしている場合、あなたのタグは、少し不明瞭です。私はこの点について間違っている可能性があります。

Anwser:

あなたが送信しているコードが認可コードではありません。認可コードのみをgrant_type = authorization_codeに送ることができます。ソリューション:

あなたがのOAuth2で知っておくべきコードまたはトークンの3種類があります:Googleのコードとトークンの

タイプauthorization_codeを送信します。

  1. 認証コード。
  2. 更新

トークントークン

  • アクセスユーザーのアクセスを要求し、彼らはあなたがAuthorization code与えられているアプリケーションへのアクセスを許可します。認証コードは短命で10分未満であり、一度しか使用できません。

    認証コードは、Googleの認証サーバーから最初のアクセストークンと更新トークンを取得するために使用されます。 grant_type=authorization_code

    アクセストークンは約1時間有効です。彼らはあなたがあなたには、いくつかのクォータを吹き消すいないと仮定するとその時間の間、トークンとして頻繁にあなたが望むように、アクセスを使用できるAPI

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

    をGoogleに呼び出しを行うために使用されています。

    リフレッシュトークンは、現在のアクセストークンが期限切れになったとき、または新しいアクセストークンを必要とするときに、Google認証サーバーから新しいアクセストークンを要求するために使用されます。ここではgrant_type=refresh_tokenは、基本的にGoogleに伝えている新しいアクセストークンを要求するために使用されます。私はあなたに何をすべきかを知っている更新トークンを送信しています。

    追加の読み取り

    私はOAuthの学習するときGoogle 3 Legged OAuth2 FlowGoogle Developer Console Oauth2 credentials

    がまた役に立つあなたを助けるかもしれないチュートリアルのクーペ持っている:The OAuth 2.0 Authorization Framework

  • +0

    ありがとう!申し訳ありませんが、私の前提は、JAPI/AngularJS経由でログインするときに認証コードを取得し、交換用にサーバーに送信するということでした。最初の2つの段落で述べたアクセストークンと認証コードの違いを教えてください。それが私を助けることがあります。だから、基本的に私はGAPI(そしてAngularJS)を使ってクライアント側で認証を行い、サーバー側でアクセスコードを再利用しようとしています。 OursはWebアプリケーションなので、より実現可能であることがわかりました。サーバー側で認証を行うことをお勧めしますか? –

    +0

    私は生のHTTPコールのoauthフローについて説明するチュートリアルを持っています。 http://www.daimto.com/google-3-legged-oauth2-flow/クライアント側ではなくサーバー側で認証する必要がありますGapiが使用できるリフレッシュトークンをあなたに渡すかどうか不安です。 – DaImTo

    +0

    もう一度ありがとう!しかし、私はこの疑いを持っています。サーバー上での認証はどのように行いますか?それはウェブブラウザと統合され、リクエストは直接Googleサーバーに送られます。 Googleは、Googleのサーバーにユーザーの資格情報を保存することを許可しません(または可能であっても賢明ではありません)。現在、新しいGoogleウィンドウがポップアップし、認証時にコールバック関数でアクセスコードが取得されます。 –

    関連する問題