2017-03-02 155 views
0

在一个web应用程序,我已经开发出一种client-server authentication该工作正常,流动:接入码 - 无效凭证

  • 客户端生成与grantOfflineAccess
  • 客户端的接入码将代码传递给服务器
  • 服务器(相同client_id),检查代码的完整性,然后向Google请求access_tokenrefresh_token
  • 令牌被保存以供以后在离线模式下重用。

现在我想产生Chrome应用的接入码,使得接入代码传递给(相同)的服务器,以请求令牌后期再利用离线。

使用用于Web应用程序相同的client_id,我请求与chrome.identity.launchWebAuthFlow的代码,这个网址参数(清洗可读性):

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的一部分。

问题是,当我然后发送访问代码到我的Web服务器,当它试图生成令牌时,我得到一个Invalid Credentials 401错误。

我错过了什么吗?

我也尝试过使用不同的client_id,其中一个通过应用ID与Chrome应用绑定。在此过程中,我确实检查了manifest.json中的密钥是否与安装的应用程序提供的密钥相同(如所述here)。但是,成功生成访问代码后,服务器得到相同的错误消息。

编辑

服务器端,我用的接入码喜欢生成令牌:

$aCode = $_POST['authcodefromclient']; 
$token = $googleClient->authenticate($aCode); 

回答

0

这里是OAuth的流程的简要介绍。

您第一次申请授权时,您将会短命访问代码。使用此访问码请求离线刷新令牌。保存刷新令牌。只要您的应用需要访问受保护的资源,它就会使用刷新令牌请求访问令牌。当您拨打Google API时,此访问令牌将作为http授权标头提供。从您的描述中可以看出,当您使用访问令牌时,您正在使用访问代码。

+0

这就是我正在做的事情,正如我在生成访问和刷新标记所采用的步骤中概述的那样。事实上,我的流程适用于我的Web应用程序和服务器端应用程序。只有当我尝试使用'chrome.identity.launchWebAuthFlow'在Chrome应用程序中生成的代码完成同样的事情时,授权才会失败。 – ghego1

+0

授权您的应用程序后,您无需重新授权。如果您浏览链接的页面,则不会对访问代码产生任何影响。 – pinoyyid

+0

据了解,我正尝试首次授权应用程序:1.新用户授予客户端应用程序的访问权限; 2.代码传递给服务器; 3.服务器执行脱机身份验证逻辑。正如我所提到的,我已经实现了oauth2逻辑,它正在我的web应用程序和服务器之间工作,所以我的问题在于在Chrome应用程序中实现相同的逻辑。 – ghego1