我正在尝试在我的系统中实现一次性代码登录流程。
申请包含两部分:
1)Android应用程序,它要求Google+提供一次性授权代码
2)Rails服务器从请求头中的android应用程序接收一次性代码,并尝试从Google +交换access_token
和id_token
的代码
问题是,如果我在浏览器中使用JavaScript登录按钮获得一次性代码,那么一切运行良好,但是当Android应用程序获得一次性代码然后发送到我的服务器时,该代码无效。
我总是
"error" : "redirect_uri_mismatch"
我的服务器设置如下:
{ "web":
{ "client_id": "MY_REGISTERED_WEB_APP_CLIENT_ID",
"client_secret": "MY_CLIENT_SECRET",
"redirect_uris": ["postmessage"],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token"
}
}
现在,我如何从Android应用程序请求一次性代码:
我使用与我的服务器上相同的MY_REGISTERED_WEB_APP_CLIENT_ID
来请求一次性代码。我不知道,也许我必须在Android上使用另一个客户端ID,这对应于我的Android应用程序?但所有找到的文档和文章都指向已注册
网络应用client_id
。
或者我的rails服务器可能不是针对网络配置的,而是针对在Google控制台应用中注册的已安装类型?
现在关于redirect_uris
。
我尝试在Google控制台中设置多个redirect_uris
:
http://localhost:5000
https://localhost:5000
http://my.deployment.url/auth2callback
Google控制台中的网络来源设置为
- http://my.deployment.url
- http://localhost:5000
无法弄清楚我做错了什么。
实际上我不明白为什么我需要设置这个redirect_uris
值,因为我不希望收到来自Google的回调,我只想获得access_token
并使用它来访问Google +。
答案 0 :(得分:2)
这种情况正在发生,因为您的Android应用程序用于创建初始登录流的redirect_uri与服务器在尝试为access_token进行代码扩展时使用的redirect_uri不同。用户返回的redirect_uri和令牌交换中使用的redirect_uri必须匹配。
答案 1 :(得分:1)
在这种情况下,正确redirect_uri
为"urn:ietf:wg:oauth:2.0:oob"