我想从 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:
const response = await axios.post(`https://oauth2.googleapis.com/tokeninfo?id_token=${token}`);
const email = response.data.email;
但这并没有验证任何人都可以发送该令牌并获得类似的结果......
我想通过验证用户发送的令牌来安全地获取用户电子邮件。