【发布时间】:2021-07-24 13:33:02
【问题描述】:
我想从 google auth 获得一封有效的电子邮件,并只需单击使用 google 登录按钮注册我的用户,这样我就可以获得一个令牌,包括这样的用户电子邮件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="google-signin-client_id" content="203772907695-qd52ou2r1bcsht8f515lh63cpqaateq2.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<title>Login</title>
</head>
<body>
<div class="g-signin2" data-onsuccess="onSignIn"></div>
<script>
function onSignIn(googleUser) {
var id_token = googleUser.getAuthResponse().id_token;
console.log(id_token);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/login');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
if(xhr.responseText == 'success'){
signOut();
location.assign('/profile')
}
};
xhr.send(JSON.stringify({token : id_token}));
}
</script>
</body>
</html>
上面的代码获取token,然后简单地发送到服务器,对吗?
现在在服务器端,我可以使用console.log(token) 记录我们成功发送的客户端令牌:
// Google Auth
const {OAuth2Client} = require('google-auth-library');
const CLIENT_ID = '203772907695-qd52ou2r1bcsht8f515lh63cpqaateq2.apps.googleusercontent.com'
const client = new OAuth2Client(CLIENT_ID);
app.post('/login', (req,res)=>{
let token = req.body.token;
console.log(token); // gets the token successfully
// then we should verify that this token is valid not one sent by a hacker right?
})
问题是我们如何验证这个token 是有效的,而不是由黑客发送的?
因为正如您所见,黑客可以简单地做我们在客户端所做的事情,然后像我们的令牌一样向我们发送令牌......
我现在的做法是向这个 url 发送带有令牌的 post 请求:
const response = await axios.post(`https://oauth2.googleapis.com/tokeninfo?id_token=${token}`);
const email = response.data.email;
但这并不能验证任何人都可以发送该令牌并获得类似结果...
我想通过验证用户发送的令牌来安全地获取用户电子邮件。
【问题讨论】:
标签: javascript node.js google-auth-library