如何从 Google OAuth2 获取用户信息
How to get user info from Google OAuth2
Google 正在强制升级他们的 authentication/authorization 机制,弃用他们现有的机制。
整个“GoogleAuth”对象和所有方法都已弃用。
迁移指南提供了旧的 > 新的指南和示例(其中许多不能像描述的那样工作,但那是另一回事)。
旧的 GoogleAuth 对象有一个特别必要的方法 .getUserInfo()。
文档不提供此对象上大多数方法的迁移路径,也不提供此对象的迁移路径。 (迁移文档仅针对此方法说“删除”。)迁移中示例代码的 None 为此提供了指导。
有一组配套文档描述了不同的代码路径,似乎与新的 Google 身份服务不完全兼容,这表明用户数据嵌入在 JWT 中,但是没有提供有关如何解密该 JWT 的指导。
我用于验证、授权和访问 google 的 api 的代码或多或少可以正常使用(仍然会在每次加载新页面时弹出一个对话框,仍在处理中),但是在仔细检查每个迁移文档、代码示例和大量搜索后,获取用户信息让我很沮丧。
有人破解过这个坚果吗?
我非常害怕答案如此简单,以至于我花了一整天的时间来敲自己的脑袋。
我更怕不可能!
是的,这是可能的。我理解您的沮丧,但您的“问题”更多是关于表达您的沮丧,而不是解释您到目前为止所做的事情以便我们可以帮助您。但是,让我尝试提供尽可能多的帮助。
正如您已经发现的那样,“Google 身份服务”将“授权”和“身份验证”分为两个不同的部分。 (在我个人看来,这让我们开发人员更难了,尽管他们[google] 声称更安全,但我不这么认为)。
我认为您需要“身份验证”部分,因为您需要用户信息。在这种情况下,您必须遵循指南 documented here.
是否要使用“使用 Google 登录”按钮或“一次点击”提示,由您决定。我决定使用“一次点击”提示。取回凭据响应后,您必须解码响应中的 JWT。您可以使用许多 JWT 库,为了本示例的目的,我使用了这个:https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.20/jsrsasign-all-min.js
,但是您有责任找到一个允许您这样做的安全库,因此 Google不推荐任何。
这是我使用的代码示例:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://accounts.google.com/gsi/client" async defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.20/jsrsasign-all-min.js"></script>
</head>
<body>
<h1>Hello World!</h1>
<div id="signinBox"></div>
<script src="app.js"></script>
</body>
</html>
app.js
window.onload = function () {
google.accounts.id.initialize({
client_id: 'blablabla.apps.googleusercontent.com',
callback: handleCredentialResponse,
ux_mode: "redirect",
prompt_parent_id: "signinBox",
context: "signin",
cancel_on_tap_outside: false,
auto_select: true
});
google.accounts.id.prompt((notification) => {
if(notification.isNotDisplayed() || notification.isSkippedMoment()) {
console.log("Prompt cancelled by user");
}
});
};
const handleCredentialResponse = (credsResponse)=>{
console.log(credsResponse);
var headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(credsResponse.credential.split(".")[0]));
var payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(credsResponse.credential.split(".")[1]));
console.log(headerObj);
console.log(payloadObj);
};
在运行上面的例子之后,你会在“payloadObj”中看到用户信息。它应该包含 explained here.
的所有信息
Google 正在强制升级他们的 authentication/authorization 机制,弃用他们现有的机制。
整个“GoogleAuth”对象和所有方法都已弃用。
迁移指南提供了旧的 > 新的指南和示例(其中许多不能像描述的那样工作,但那是另一回事)。
旧的 GoogleAuth 对象有一个特别必要的方法 .getUserInfo()。
文档不提供此对象上大多数方法的迁移路径,也不提供此对象的迁移路径。 (迁移文档仅针对此方法说“删除”。)迁移中示例代码的 None 为此提供了指导。
有一组配套文档描述了不同的代码路径,似乎与新的 Google 身份服务不完全兼容,这表明用户数据嵌入在 JWT 中,但是没有提供有关如何解密该 JWT 的指导。
我用于验证、授权和访问 google 的 api 的代码或多或少可以正常使用(仍然会在每次加载新页面时弹出一个对话框,仍在处理中),但是在仔细检查每个迁移文档、代码示例和大量搜索后,获取用户信息让我很沮丧。
有人破解过这个坚果吗?
我非常害怕答案如此简单,以至于我花了一整天的时间来敲自己的脑袋。
我更怕不可能!
是的,这是可能的。我理解您的沮丧,但您的“问题”更多是关于表达您的沮丧,而不是解释您到目前为止所做的事情以便我们可以帮助您。但是,让我尝试提供尽可能多的帮助。
正如您已经发现的那样,“Google 身份服务”将“授权”和“身份验证”分为两个不同的部分。 (在我个人看来,这让我们开发人员更难了,尽管他们[google] 声称更安全,但我不这么认为)。
我认为您需要“身份验证”部分,因为您需要用户信息。在这种情况下,您必须遵循指南 documented here.
是否要使用“使用 Google 登录”按钮或“一次点击”提示,由您决定。我决定使用“一次点击”提示。取回凭据响应后,您必须解码响应中的 JWT。您可以使用许多 JWT 库,为了本示例的目的,我使用了这个:https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.20/jsrsasign-all-min.js
,但是您有责任找到一个允许您这样做的安全库,因此 Google不推荐任何。
这是我使用的代码示例:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://accounts.google.com/gsi/client" async defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.20/jsrsasign-all-min.js"></script>
</head>
<body>
<h1>Hello World!</h1>
<div id="signinBox"></div>
<script src="app.js"></script>
</body>
</html>
app.js
window.onload = function () {
google.accounts.id.initialize({
client_id: 'blablabla.apps.googleusercontent.com',
callback: handleCredentialResponse,
ux_mode: "redirect",
prompt_parent_id: "signinBox",
context: "signin",
cancel_on_tap_outside: false,
auto_select: true
});
google.accounts.id.prompt((notification) => {
if(notification.isNotDisplayed() || notification.isSkippedMoment()) {
console.log("Prompt cancelled by user");
}
});
};
const handleCredentialResponse = (credsResponse)=>{
console.log(credsResponse);
var headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(credsResponse.credential.split(".")[0]));
var payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(credsResponse.credential.split(".")[1]));
console.log(headerObj);
console.log(payloadObj);
};
在运行上面的例子之后,你会在“payloadObj”中看到用户信息。它应该包含 explained here.
的所有信息