>Feathers使用JSON Web token进行身份验证。如何有条件地设置令牌的expiresIn
属性取决于是否选中"记住我"。
更新的想法 :这种方法是一种黑客攻击(可能具有安全隐患) - 我认为应该发生的是,如果您单击记住我,您应该获得一个刷新令牌,如果它过期或不存在,应该用于自动颁发新令牌。我很想听听羽毛开发人员有什么建议 - 我正在研究这个问题,如果我找到更好的解决方案,我会报告
。基于 cookie 的解决方案可能发生的情况是,如果用户设置了记住我,则会向他们颁发一个具有到期日期的令牌,否则他们会获得一个会话 cookie,一旦浏览器会话结束(浏览器关闭),该 cookie 就会被删除。当将JSON Web Token(JWT)与feathers.authentication
(<1.x ??)一起使用时,我们将JSON Web Token(JWT)存储在存储提供程序中,例如localStorage
。如果您希望您的登录令牌在浏览器关闭后消失,则应使用sessionStorage
。
我目前的解决方案是同时使用两者,具体取决于我登录时的表单值。如果用户选择"记住我",我将调用storage.setShouldPersist(true)
(同样storage.setShouldPesist(false)
如果未选中"记住我"),这将在localstorage中放置一个标志,说我们处于"localStorage"模式。我将鸭子类型的存储(getItem
、setItem
等)传递给feather.authentication
,该对象检查我的 rememberme 键是否存在。如果是这样,则使用localStorage
否则使用sessionsStorage
。
这是代码:
// localOrSessionStore.js
const { localStorage, sessionStorage } = global;
export default function localOrSessionStore({ key }) {
let shouldPersist = localStorage.getItem(key) === 't';
return {
setShouldPersist(persist) {
shouldPersist = !!persist;
if (persist) {
localStorage.setItem(key, 't');
} else {
localStorage.removeItem(key);
}
},
getItem(name) {
if (shouldPersist) {
return localStorage.getItem(name);
}
return sessionStorage.getItem(name);
},
setItem(name, value) {
if (shouldPersist) {
return localStorage.setItem(name, value);
}
return sessionStorage.setItem(name, value);
},
removeItem(name) {
if (shouldPersist) {
return localStorage.removeItem(name);
}
return sessionStorage.removeItem(name);
},
};
}
然后用法:
# feathers.js - where I set up feathers for my app
export const storage = localOrSessionStore({ key: 'myapprmbr' });
export default feathers()
.configure(rest('/api').fetch(fetch))
.configure(feathers.hooks())
.configure(feathers.authentication({
storage, // Passed into feathers-auth here
tokenKey: 'myappjwt',
});
新的feathers-authetication@>=1.x
和feathers-authetication-client
包有一些我还不熟悉的更改,这些更改可能会更好地启用"记住我"功能。
不记住 JWT 的方法不是将其存储在客户端。如果使用具有身份验证的 Feathers 客户端,则令牌将作为feathers-jwt
存储在 localStorage 中。您可以通过调用
localStorage.removeItem('feathers-jwt')