Oauth 2.0 Chrome应用程序中Google Oauth2的访问代码-凭据无效

Oauth 2.0 Chrome应用程序中Google Oauth2的访问代码-凭据无效,oauth-2.0,google-oauth,google-chrome-app,Oauth 2.0,Google Oauth,Google Chrome App,在一个web应用程序中,我开发了一个工作正常的流: 客户端使用grantofleaccess 客户端将代码传递给服务器 服务器(相同的client\u id)检查代码的完整性,然后需要access\u token和refresh\u token访问谷歌 令牌被保存,以便以后在脱机模式下重用 现在我想在Chrome应用程序中生成访问代码,以便将访问代码传递到(同一)服务器,以请求令牌进行后期脱机重用 使用与web应用相同的client\u id,我请求使用chrome.identity.lau

在一个web应用程序中,我开发了一个工作正常的流:

  • 客户端使用
    grantofleaccess
  • 客户端将代码传递给服务器
  • 服务器(相同的
    client\u id
    )检查代码的完整性,然后需要
    access\u token
    refresh\u token
    访问谷歌
  • 令牌被保存,以便以后在脱机模式下重用
现在我想在Chrome应用程序中生成访问代码,以便将访问代码传递到(同一)服务器,以请求令牌进行后期脱机重用

使用与web应用相同的
client\u id
,我请求使用
chrome.identity.launchWebAuthFlow
的代码,并使用以下url参数(已清除以便于阅读):


下面是OAuth流的简要概述


首次请求授权时,您将收到一个短暂的访问代码。使用此访问代码请求脱机刷新令牌。保存刷新令牌。每当您的应用需要访问受保护的资源时,它都会使用刷新令牌请求访问令牌。当您调用Google API时,此访问令牌作为http授权头提供。从您的描述中可以看出,当您应该使用访问令牌时,您正在使用访问代码。

可以通过chrome.identity.launchWebAuthFlow(),但是这将要求chrome用户键入其登录凭据。检查此答案:


如果您不需要长时间访问用户的Google帐户,您可以通过
chrome.identity.getAuthToken
中的
access\u令牌获得临时访问权限。我喜欢这样,因为Chrome用户不必输入他们的凭据(如果他们登录到Chrome浏览器或ChromeBook)。我将
access\u令牌
传递给我的服务器,然后通过调用来验证它:{0}

正如我在生成访问和刷新令牌的步骤中所概述的那样,这就是我的操作方式。事实上,我的流程确实适用于我的web应用程序和服务器端应用程序。只有当我尝试使用
Chrome.identity.launchWebAuthFlow
对Chrome应用程序中生成的代码执行完全相同的操作时,授权才会失败。一旦你授权了你的应用程序,你就无需重新对其进行授权。如果你浏览你链接到的页面,它与访问代码无关。这是可以理解的,我正试图第一次授权该应用程序:1。新用户从客户端应用程序授予访问权限;2.代码被传递到服务器;3.服务器执行脱机身份验证逻辑。正如我提到的,我已经实现了oauth2逻辑,它在我的web应用程序和服务器之间工作,所以我的问题在于在Chrome应用程序中实现相同的逻辑。我想我不明白为什么要使用launchWebAuthFlow在Chrome中启动流,文档中说“适用于登录非谷歌帐户的用户“然后在服务器上完成它。可能存在访问代码必须从同一IP提交的限制。我已经运行了一些测试,它似乎与用户的IP无关,因为即使web应用位于与服务器不同的IP地址,系统也可以工作。正如我在问题中提到的,我这样做是因为我想获得脱机访问,这在
chrome.identity.getAuthToken
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]
$aCode = $_POST['authcodefromclient'];
$token = $googleClient->authenticate( $aCode );