2

我正在尝试将从客户端应用程序获得的 OAuth 一次性使用代码交换为服务器上的访问令牌和刷新令牌。我得到的回应是:

{
    "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

我已经根据 API 控制台中的内容检查了我的客户端 ID 和客户端密码,并且它们匹配。

我使用以下 Java 代码在客户端上获得一次性使用代码:

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 /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 不匹配问题。

编辑:引用 postmessage 的另一个答案:https ://stackoverflow.com/a/18990268/775359

于 2015-04-19T11:13:12.500 回答