我想将谷歌登录集成到已有帐户注册和登录的应用程序中。
我遵循了一些 YouTube 教程,现在我的前端可以通过 google 进行工作登录。成功登录后,它会返回一个 JWT。解码后,我会得到一个对象,其中包含电子邮件、姓名、pfp 和其他一些我不知道其用途的属性。
我该怎么办?
在我的快递服务器中,我有一个注册路线
router.post("/register", async (req, res, next) => {
try {
// expects {email, password} in req.body
const { password, email } = req.body;
const user = await User.create(req.body);
const token = jwt.sign(
{ id: user.dataValues.id },
process.env.SESSION_SECRET,
{ expiresIn: 86400 }
);
res.json({
...user.dataValues,
token,
});
} catch (error) {
if (error.name === "SequelizeUniqueConstraintError") {
return res.status(401).json({ error: "Email already exists" });
} else if (error.name === "SequelizeValidationError") {
return res.status(401).json({ error: "Validation error" });
} else next(error);
}
});
登录路径类似。
我使用的数据库是带有sequelize ORM的postgres,User.create(...)
基本上只是创建一个用户并存储散列密码以供稍后验证。
正如您所看到的,如果他们使用谷歌身份验证,则不会有密码,而常规注册则有。如果未给出密码,我是否只允许 User.create 也创建用户?这样安全吗?正确的做法是什么?
登录您的应用程序的用户必须
- 在您的登录表单中输入他们的电子邮件地址和密码,然后您的应用程序会检查密码哈希并创建
token = jwt.sign(...)
。我建议您的 JWT 也包含电子邮件地址,最好采用与 Google JWT 使用的格式相同的格式。
- 或者启动 Google 登录流程,然后 Google 向您的应用程序发送 JWT。在此流程中,不会从您的用户数据库中查找密码哈希,但如果您的数据库中尚不存在 Google 电子邮件地址,则它是一个新用户,您必须为其插入一条记录到您的数据库中(只有电子邮件地址,没有密码) )。
JWT 应该有一个iss claim https://datatracker.ietf.org/doc/html/draft-ietf-oauth-json-web-token#section-4.1.1它告诉您它是由您的应用程序还是由 Google 发布的。就 Google 而言,JWT 由 Google 签名,并且在您的/register
and /login
您必须验证签名的路线jwt.verify https://www.npmjs.com/package/jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback使用 Google 的公钥(大概this https://www.googleapis.com/oauth2/v3/certs)。 (实际上,如果您使用 Google 等第三方身份验证服务,注册和登录并没有太大区别。)
我假设在这两种情况下您都将 JWT 存储在会话 cookie 中
res.cookie("jwt", token, {httpOnly: true});
并且后续的每个请求都必须重复JWT的签名验证
try {
var jwt = jwt.verify(req.cookies.jwt, publicKey);
if (jwt.exp <= new Date().getTime() / 1000)
throw "expired";
// Token verification succeeded
} catch(e) {
// Token verification failed
}
(使用您自己的应用程序的公钥或使用 Google 的公钥,具体取决于iss
)。只有验证成功后,请求才算通过身份验证,您就可以根据电子邮件地址从用户存储中检索用户记录。
因此,您使用的数据库中的密码(哈希)是可选的,但即使有密码的用户也可以使用 Google 进行登录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)