如何在 feathers.js 和 JWT 中实现 "remember me" 特性
How to implement "remember me" feature in feathers.js and JWT
Feathers 使用 JSON 网络令牌进行身份验证。如何有条件地设置令牌的 expiresIn
属性 取决于 "remember me" 是否被选中。
不记住 JWT 的方法是不将其存储在客户端。如果您使用带有身份验证的 Feathers 客户端,令牌将作为 feathers-jwt
存储在 localStorage 中。您可以通过调用
为下一个浏览器会话 "unremember"
localStorage.removeItem('feathers-jwt')
更新的想法:这种方法是一种黑客攻击(可能具有安全隐患)——我认为应该发生的是如果你点击记住我,你应该发布了一个刷新令牌,如果它过期或不存在,应该使用它自动发布一个新令牌。我很想听听 Feathers 开发人员有什么建议 - 我正在调查这个问题,如果我找到更好的解决方案,我会反馈
基于 cookie 的解决方案可能发生的情况是,如果用户设置了记住我,他们将获得一个带有到期日期的令牌,否则他们将获得一个会话 cookie,一旦浏览器会话结束(浏览器已关闭)。当使用 JSON Web 令牌 (JWT) 和 feathers.authentication
(< 1.x ??) 我们将 JSON Web 令牌 (JWT) 存储在存储提供程序中,例如 localStorage
。如果您希望您的登录令牌在浏览器关闭后消失,您应该使用 sessionStorage
.
我目前的解决方案是同时使用两者,具体取决于我登录时的表单值。如果用户选择 'remember me',我将调用 storage.setShouldPersist(true)
(同样 storage.setShouldPesist(false)
如果没有选中记住我),这将在本地存储中放置一个标志,说明我们处于 "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
包有一些我还不熟悉的变化,这可能会更好地实现记住我的功能。
Feathers 使用 JSON 网络令牌进行身份验证。如何有条件地设置令牌的 expiresIn
属性 取决于 "remember me" 是否被选中。
不记住 JWT 的方法是不将其存储在客户端。如果您使用带有身份验证的 Feathers 客户端,令牌将作为 feathers-jwt
存储在 localStorage 中。您可以通过调用
localStorage.removeItem('feathers-jwt')
更新的想法:这种方法是一种黑客攻击(可能具有安全隐患)——我认为应该发生的是如果你点击记住我,你应该发布了一个刷新令牌,如果它过期或不存在,应该使用它自动发布一个新令牌。我很想听听 Feathers 开发人员有什么建议 - 我正在调查这个问题,如果我找到更好的解决方案,我会反馈
基于 cookie 的解决方案可能发生的情况是,如果用户设置了记住我,他们将获得一个带有到期日期的令牌,否则他们将获得一个会话 cookie,一旦浏览器会话结束(浏览器已关闭)。当使用 JSON Web 令牌 (JWT) 和 feathers.authentication
(< 1.x ??) 我们将 JSON Web 令牌 (JWT) 存储在存储提供程序中,例如 localStorage
。如果您希望您的登录令牌在浏览器关闭后消失,您应该使用 sessionStorage
.
我目前的解决方案是同时使用两者,具体取决于我登录时的表单值。如果用户选择 'remember me',我将调用 storage.setShouldPersist(true)
(同样 storage.setShouldPesist(false)
如果没有选中记住我),这将在本地存储中放置一个标志,说明我们处于 "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
包有一些我还不熟悉的变化,这可能会更好地实现记住我的功能。