我决定将JWT实施为我正在构建的Web应用程序的授权方法。我之所以选择这种方法,是因为我不想在每个请求中都查询数据库,并且因为水平扩展更容易(我不需要在负载均衡器上使用粘性会话)。
这种方法的缺点是我必须在accessTokens上设置到期日期/时间,否则用户将永远可以访问我的webapp。解决方案是使用refreshTokens。
但是,这又是一个缺点,我现在必须在数据库中维护这些令牌,以便在用户更改密码时或帐户被盗用时可以撤消这些令牌。
我想知道是否有更好的方法?
所以我想出了这个策略,如果我忽略了一些东西,我想请您发表看法:
1。)首先,让我说数据库中的所有用户对象都维护一个名为“ passwordLastChanged”的属性
2。)成功登录后,我将为accessToken提供一个有效期为+4小时的有效期。访问令牌还将提供一个附加字段“ absoluteExpire”,该字段将设置为将来的7天(详情请参见下文)
3。)在4小时结束时,当用户访问需要授权的页面时,系统将首先检查数据库,特别是passwordLastChanged属性。
如果passwordLastChanged在accessToken的4小时到期之前但在其创建日期/时间之后,则迫使用户重新登录,重置整个令牌过程(换句话说,返回步骤2)。
如果已达到“ absoluteExpire”,则还将迫使用户重新登录。
否则,将再次刷新accessToken 4小时,并保留“ absoluteExpire”属性。
我可以忽略任何明显的东西吗?这是个好策略吗?
答案 0 :(得分:2)
我是一名前端开发人员,我发现如果您只需要通过电子邮件/密码,谷歌,推特等进行身份验证,那么Google Firebase是您的不二之选。设置和创建用户非常简单,就像:
import firebase from 'firebase/app'
import 'firebase/auth'
const createUser = (email, pwd) => {
firebase.auth().createUserWithEmailAndPassword(email, pwd)
.then(user => console.log(user))
.catch(e => console.log(e))
}