【发布时间】:2018-04-06 23:18:36
【问题描述】:
在一个网络应用程序中,我开发了一个可以正常工作的client-server authentication,流程:
- 客户端使用
grantOfflineAccess生成访问码 - 客户端将代码传递给服务器
- 服务器(相同的
client_id)检查代码的完整性,然后向Google 要求access_token和refresh_token。 - 保存令牌以供以后在离线模式下重复使用。
现在我想在 Chrome 应用程序中生成访问代码,以便将访问代码传递给(同一)服务器,以请求令牌以供以后离线重用。
使用与 Web 应用程序相同的 client_id,我请求带有 chrome.identity.launchWebAuthFlow 的代码,并带有此 url 参数(为便于阅读而清理):
https://accounts.google.com/o/oauth2/v2/auth?
scope=profile email https://www.googleapis.com/auth/drive
include_granted_scopes=true
state=state_parameter_passthrough_value // I actually left this as it is
redirect_uri=https://<app-id>.chromiumapp.org/chromelogin
response_type=code
access_type=offline
client_id=[same_as_webapp]
这确实有效,并且我确实获得了访问代码,作为传递给传递给 chrome.identity.launchWebAuthFlow 的回调的 url 的一部分。
问题是,当我随后将访问代码发送到我的网络服务器时,当它尝试生成令牌时,我收到 Invalid Credentials 401 错误。
我错过了什么吗?
我还尝试使用不同的client_id,它专门通过应用 ID 与 Chrome 应用绑定。这样做时,我确实检查了manifest.json 中的密钥是否等于已安装应用程序提供的密钥(如here 所述)。但是,成功生成访问码后,服务器收到同样的错误信息。
编辑
服务器端,我使用类似的访问代码来生成令牌:
$aCode = $_POST['authcodefromclient'];
$token = $googleClient->authenticate( $aCode );
【问题讨论】:
标签: oauth-2.0 google-oauth google-chrome-app