【问题标题】:Access code for Google Oauth2 in Chrome app - invalid credentialsChrome 应用中 Google Oauth2 的访问代码 - 凭据无效
【发布时间】:2018-04-06 23:18:36
【问题描述】:

在一个网络应用程序中,我开发了一个可以正常工作的client-server authentication,流程:

  • 客户端使用grantOfflineAccess生成访问码
  • 客户端将代码传递给服务器
  • 服务器(相同的client_id)检查代码的完整性,然后向Google 要求access_tokenrefresh_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


    【解决方案1】:

    可以通过chrome.identity.launchWebAuthFlow() 实现,但是这需要 Chrome 用户输入他们的登录凭据。签出这个答案: Get id_token with Chrome Identity API

    如果您长期不需要访问用户的 Google 帐户,您可以通过 chrome.identity.getAuthTokenaccess_token 获得临时访问权限。我喜欢这个,因为 Chrome 用户不必输入他们的凭据(如果他们登录到 Chrome 浏览器或 ChromeBook)。我将access_token 传递给我的服务器,然后通过调用来验证它:https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={0}

    【讨论】:

      【解决方案2】:

      这里是 OAuth 流程的简要总结。

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

      【讨论】:

      • 这就是我在生成访问和刷新令牌所采取的步骤中概述的方式。事实上,我的流程确实适用于我的 Web 应用程序和服务器端应用程序。仅当我尝试对 Chrome 应用程序中使用 chrome.identity.launchWebAuthFlow 生成的代码执行完全相同的操作时,授权才会失败。
      • 一旦您授权了您的应用程序,您就无需重新授权它。如果您浏览您链接到的页面,它对访问代码没有任何作用。
      • 这样理解,我是第一次尝试授权app: 1.新用户从客户端app授权访问; 2. 代码传递给服务器; 3.服务器做离线认证逻辑。正如我所提到的,我已经实现了 oauth2 逻辑,并且它在我的 Web 应用程序和服务器之间工作,所以我的问题在于在 Chrome 应用程序中实现相同的逻辑。
      • 我想我不明白为什么你在 Chromium 中使用 launchWebAuthFlow 启动流程,文档说“适用于登录到非 Google 帐户的用户”,然后在服务器上完成。可能存在必须从同一 IP 提交访问代码的约束。
      • 我已经运行了一些测试,但它似乎与用户的 IP 无关,因为即使 Web 应用程序位于与服务器不同的 IP 地址,系统也能正常工作。正如我在问题中提到的那样,我这样做是因为我想获得离线访问权限,而chrome.identity.getAuthToken 似乎无法做到这一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2023-03-18
      • 2014-06-28
      相关资源
      最近更新 更多