获取access_token时,Google OAuth 2.0会返回无效的redirect_uri_mismatch

时间:2013-08-07 17:51:06

标签: access-token google-oauth

我正在尝试将从客户端应用程序获取的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,但由于我正在尝试使用跨客户端授权(如here所述),因此我故意将其从POST请求中删除:

  

当它交换令牌代码时,它不应该在POST中包含“redirect_uri”参数。

对我做错了什么的想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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