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

时间:2017-03-02 17:31:52

标签: oauth-2.0 google-oauth google-chrome-app

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

  • 客户端使用grantOfflineAccess
  • 生成访问代码
  • 客户端将代码传递给服务器
  • 服务器(相同client_id),检查代码的完整性,然后需要access_tokenrefresh_token到Google。
  • 保存
  • 令牌以便以后在离线模式下重复使用。

现在,我想在Chrome应用中生成访问代码,以便将访问代码传递到(相同的)服务器,以请求令牌在线下重复使用。

使用与网络应用程序相同的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的一部分。

问题在于,当我将访问代码发送到我的Web服务器时,当它尝试生成令牌时,我收到Invalid Credentials 401错误。

我错过了什么吗?

我还尝试使用其他client_id,一个通过应用ID专门与Chrome应用相关联的manifest.json。在这样做的过程中,我确实检查了$aCode = $_POST['authcodefromclient']; $token = $googleClient->authenticate( $aCode ); 中的密钥是否等于已安装应用程序提供的密钥(如here所述)。但是,在成功生成访问代码后,服务器收到了相同的错误消息。

修改

服务器端,我使用访问代码来生成令牌:

#include <boost/hana.hpp>
namespace hana = boost::hana;


int main() {
  auto types = hana::make_set(hana::type_c< int >, hana::type_c< float >);
  auto result = hana::unpack(types, [](auto ...t) {
    return hana::make_map(hana::make_pair(t, false)...);
  });

  auto expected = hana::make_map(
    hana::make_pair(hana::type_c< int >, false),
    hana::make_pair(hana::type_c< float >, false)
  );

  BOOST_HANA_RUNTIME_ASSERT(result == expected);
}

2 个答案:

答案 0 :(得分:0)

以下是OAuth流程的简要概述。

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

答案 1 :(得分:0)

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

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

验证它