我正在尝试将从客户端应用程序获取的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”参数。
对我做错了什么的想法?
答案 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