我正在使用express
和react
撰写单页网页应用
我现在正在尝试选择验证用户身份的方式
我想让他们注册并使用电子邮件和密码以及Facebook,Google等第三方提供商登录...
我阅读了一些关于passport
和jwt
(express-with-passport,jwt-with-passport)的文章,但没有一篇文章合并jwt
和第三方提供商。
我能想到的唯一方法是在我的数据库中保存令牌,并为每个请求比较它们(第三方提供的令牌和我自己使用jwt
生成的令牌)
从我的数据库中的提供程序保存令牌并与每个请求进行比较是有意义的,但使用jwt
我只需要在不访问数据库的情况下验证令牌。
如何区分我从客户端收到的令牌?如何判断何时访问数据库(对于提供者令牌)以及何时使用jwt
进行验证?
编辑:
我想到的实施方式如下:
- 用户名&密码:登录后,生成令牌(使用jwt
)并将其发送给客户端。每个请求都将包含令牌,服务器将对其进行验证
- 第三方提供商:假设用户已通过Facebook
进行身份验证。我的服务器从passport-js
收到令牌(使用Facebook
)。现在我需要向客户端发送其令牌。我可以发送刚从Facebook收到的令牌,但是如何验证客户端在每次请求后发送给我的令牌?
因此,我可以使用jwt
再次生成一个令牌,并按上述方式工作。
这是一个很好的实现还是我错过了什么?我无法找到 一个描述所有这些方面的完整教程。
答案 0 :(得分:0)
您可以考虑根据应用程序的成功登录回调生成自己的令牌,而不是使用身份提供商可能提供给您的令牌。在每个请求滑动到期时发出新令牌,并可能考虑使用refresh tokens。
在您的数据库中,您可以在登录时存储给定用户(Facebook / Google /等)的身份验证方法。当您收到带有无效令牌的请求时,从数据库中查询此身份验证方法,然后将它们重定向到相应的身份提供者以进行重新身份验证。
这将避免对您的应用程序进行大多数“正常”JWT验证的数据库查找,并为您提供令牌的无状态特性的全部好处。