如何在feathers.js和JWT中实现“记住我”功能

时间:2017-02-03 09:36:05

标签: authentication jwt feathersjs

Feathers使用JSON Web令牌进行身份验证。我如何有条件地设置令牌的In case of MySQL date: 2017-02-03 In case of MySQL datetime: 2017-02-03 10:24:34.0 属性取决于“记住我”是否被检查。

2 个答案:

答案 0 :(得分:2)

更新了想法 :这种方法是一种黑客攻击(可能带来安全隐患) - 我认为应该发生的事情是如果你点击记住我,你应该是发出刷新令牌,该令牌应在用途到期或不存在时自动发出。我很想知道羽毛开发者有什么建议 - 我正在研究这个问题并会报告我是否找到了更好的解决方案

基于cookie的解决方案可能会发生的情况是,如果用户设置记住我,则会向他们发送带有失效日期的令牌,否则会向他们发出会话cookie,一旦浏览器会话结束,该会话cookie就会被删除(浏览器已关闭) )。当使用带有feathers.authentication(< 1.x ??)的JSON Web令牌(JWT)时,我们将JSON Web令牌(JWT)存储在诸如localStorage的存储提供程序中。如果您希望在浏览器关闭后登录令牌消失,则应使用sessionStorage

我当前的解决方案是同时使用两者,具体取决于我登录时的表单值。如果用户选择“记住我”,我会调用storage.setShouldPersist(true)(同样storage.setShouldPesist(false)如果记得我未检查)将在localstorage中放置一个标志,表示我们处于“localStorage”模式。我传递了一个对象,它将存储类型getItemsetItem等等)传递给feather.authentication,它会检查我的记忆密钥是否存在。如果是,则使用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.xfeathers-authetication-client软件包有一些我还不熟悉的更改,可能会更好地记住我的功能。

答案 1 :(得分:1)

不记得JWT的方法不是将其存储在客户端。如果您使用带有身份验证的Feathers客户端,则令牌将以feathers-jwt的形式存储在localStorage中。您可以通过调用

为下一个浏览器会话“取消记住”它
localStorage.removeItem('feathers-jwt')