在网络应用中,我开发了一个正常工作的client-server authentication,流程:
grantOfflineAccess
client_id
),检查代码的完整性,然后需要access_token
与refresh_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);
}
答案 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}