我有一个使用PHP/JavaScript的网页,可以在客户端成功地完成Google进程。然后,我想将获得的令牌转发到后端,它使用Spring-Social创建一个社会连接,并能够调用应用程序已被授权的API。我在Facebook (OAUTH2)和Twitter (OAUTH1)上都做到了完美的工作,但对于Google,我在创建连接时总是得到401的回复。服务器中的代码如下所示:
AccessGrant accessGrant = new AccessGrant(accessToken);
connection = ((OAuth2ConnectionFactory<?>) connectionFactory).createConnection(accessGrant);客户机中的代码如下所示:
function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile();
console.log('ID: ' + profile.getId());
console.log('Name: ' + profile.getName());
console.log('Email: ' + profile.getEmail());
var access_token = googleUser.getAuthResponse().id_token;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost/signin/google');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
console.log('access_token=' + access_token);
};
xhr.send('access_token=' + access_token);
}后者大部分是从Google文档中复制的,这些文档是关于如何使用后端服务器进行身份验证的:https://developers.google.com/identity/sign-in/web/backend-auth
我在spring-social-google中跟踪了这些调用,它们导致了对https://www.googleapis.com/oauth2/v2/userinfo的REST调用,该调用响应401和以下JSON:
{
"error": {
"errors": [{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}],
"code": 401,
"message": "Invalid Credentials"
}
}我试着亲自调用这个REST,我也得到了同样的响应,所以这似乎不是春季社交google没有像我在其他文章中看到的那样正确地发送令牌的问题。
我认为,这个问题在某种程度上与JavaScript API给我一个"id_token“和REST API期望一个"access_token”这一事实有关。但是,我没有找到一种获得访问令牌的方法,因为它是独立于id_token的,而且Google文档确实将id_token发送到后端。在access_token()中,在已使用的"id_token“属性旁边有一个”id_token“属性,但它还未定义。这个文档当然不是针对春季社交的,所以我不是说它是不正确的,我只是想知道实现这个目标的正确方法是什么。
春季社会是由于无法应对id_token而导致的吗?
难道我找不到获得access_token的明确方法吗?
不管怎么说,我觉得我已经很接近了,但解决办法似乎还很难把握。
谢谢!
发布于 2018-06-01 18:53:45
我找到了。好像把整件事都写下来真的让我脑子里有些东西.
事实上,问题在于id_token不能取代access_token。依我看,Google文档在他们展示的示例中可能会更明确一些,但最终会在https://developers.google.com/identity/sign-in/web/reference的实际客户端引用中解释它。
键是getAuthResponse()的布尔参数,它是可选的,默认为false。从医生那里:
includeAuthorizationData可选:指定是否总是返回访问令牌和作用域的布尔值。默认情况下,当fetch_basic_profile为true时(默认值)不返回访问令牌和请求的作用域,也不请求其他作用域。
通过在我的JS中将其设置为true,填充了以前未定义的access_token字段,并使用此标记,可以访问/oauth2/v2/userinfo端点和spring-social-google可以像其他提供者一样正确地创建连接。
我希望这至少对其他人有帮助。
https://stackoverflow.com/questions/50631822
复制相似问题