【问题标题】:Logout using FeathersJS REST API使用 FeathersJS REST API 注销
【发布时间】:2020-03-19 04:44:04
【问题描述】:

使用新生成的 FeathersJS 应用程序(本地身份验证),我正在执行以下 REST api 调用:

  1. GET /users - 未授权失败
  2. POST /authentication with username and password - 成功
  3. GET /users - 成功并返回用户列表
  4. DELETE /authentication - 返回 auth 对象,没有错误消息 (并在服务器端生成注销事件)
  5. GET /users - 成功并返回用户列表

我的预期结果是,在第 5 步我会收到未授权错误,因为 JWT 令牌在服务器端注销后会过期。

我做错了什么?如何仅使用 REST api 正确注销用户,因此令牌将失效?还是身份验证只能与 FeathersJS 客户端库一起使用?

附言我正在尝试将 FeathersJS 作为我的 Flutter 应用程序的后端 REST API 的潜在解决方案。因此,我只对 FeathersJS 的服务器端实现感兴趣。

【问题讨论】:

  • Feathers auth 不是基于会话的东西,它使用客户端令牌。存在调用 DELETE /authentication 以便您可以在自己的代码中采取措施来实现服务器端注销(例如,将当前令牌列入黑名单),但它不是内置的。如果客户端仍然拥有身份验证令牌,那么它将继续工作直到其到期(嵌入在 JWT 中)
  • 我并不是说它是基于会话的东西。根据我使用 express.js 后端的经验,JWT 令牌在注销时在服务器端失效
  • Feathers 不会自动执行此操作。删除钩子在那里,因此您可以连接自己的逻辑来处理已发布令牌的服务器端失效/跟踪,但这不是内置功能。
  • 也许你能指出描述如何使用钩子删除或使令牌无效的文档或示例?我找不到任何可以描述使用令牌服务器端进行操作的内容
  • 没有内置任何东西。您将在身份验证服务的remove 方法上创建一个after 挂钩,并对那里的令牌采取行动(应该在params.authentication.payload IIRC 中)

标签: rest feathersjs feathers-authentication


【解决方案1】:

FeathersJS 是无状态的。因此,在您的客户端中,只需将您的访问令牌设置为 null。

【讨论】:

  • 如果我可能会问 - 如果 FeathersJS 必须验证每个客户端的令牌,那么它怎么可能是无状态的,那么这些令牌需要以某种方式存储在 FeathersJS 中?哪个是州?
  • 我建议查看 JSON Web Tokens 的工作原理。是的,Feathers 必须验证令牌。但它是通过序列化令牌中的数据并在将其返回给您(您返回的访问令牌)之前使用其秘密对其进行签名来实现的。在随后的请求中,您向 Feathers 发送访问令牌,其中包含所有编码的数据。 Feathers 然后通过检查您发送的令牌来验证数据。没有实际的验证信息(除了秘密)保存在服务器上。因此,没有“状态”保存在服务器上。因此,与所有其他 REST API 一样,Feathers 是无状态的。
  • @MartinsUntals 这是一个很好的视频,它解释了 JWT 的工作原理,以及它与会话的比较,我认为您的困惑来自于此。 youtu.be/7Q17ubqLfaM希望这会有所帮助:)
【解决方案2】:

我使用 socketio 客户端。我通常通过调用 app.logout() 来注销用户,然后清除 localStorage 项目“feathers-jwt”以确保安全。按照此https://docs.feathersjs.com/api/client/rest.html#feathersjs-rest-client 阅读有关如何配置 REST 客户端的信息。希望对你有帮助

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2014-12-22
    • 2016-07-17
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多