2

クライアント側アプリから取得した OAuth の 1 回限りの使用コードを、サーバー上のアクセス トークンとリフレッシュ トークンに交換しようとしています。私が得る応答は次のとおりです。

{
    "error" : "redirect_uri_mismatch"
}

私の POST リクエストは次のとおりです。

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code={My Code}&
client_id={My Client ID}&
client_secret={My Client Secret}&
grant_type=authorization_code

クライアント ID とクライアント シークレットを API コンソールのクライアント ID と照合して確認しましたが、一致しています。

次の Java コードを使用して、クライアントで 1 回限りのコードを取得します。

static final List<String> SCOPES = Arrays.asList(new String[]{"https://www.googleapis.com/auth/plus.login","https://www.googleapis.com/auth/userinfo.email"});
String scope = String.format("oauth2:server:client_id:%s:api_scope:%s", SERVER_CLIENT_ID, TextUtils.join(" ", SCOPES));
final String token = GoogleAuthUtil.getToken(c, email, scope); 

API コンソールに redirect_uri がありますが、(ここで説明されているように) クロスクライアント認証を使用しようとしているため、必要に応じて意図的に POST リクエストから除外しました。

コードをトークンに交換するときは、POST に「redirect_uri」引数を含めないでください。

私が間違っていることについて何か考えはありますか?

4

2 に答える 2

4

「POST に 'redirect_uri' 引数を含めるべきではない」ということは、redirect_uri フィールドを完全に省略することを意味するわけではないことがわかりました。代わりに、redirect_uri フィールドに空の値が必要であることを意味します。

私の新しい、機能する POST は次のとおりです。

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code={My Code}&
client_id={My Client ID}&
client_secret={My Client Secret}&
redirect_uri=''&
grant_type=authorization_code
于 2013-08-08T02:17:27.520 に答える
0

私の場合、次の - https://stackoverflow.com/a/25184995/775359 - 回答が役に立ちました:

var post_data = {
  code : code,
  client_id : google_client_id,
  client_secret : google_client_secret,
  redirect_uri : 'postmessage',
  grant_type : grant_type,
};

redirect_uri をpostmessageに設定すると、redirect_uri の不一致に関する問題が解決しました。

編集: ポストメッセージを参照する別の回答: https://stackoverflow.com/a/18990268/775359

于 2015-04-19T11:13:12.500 に答える