使用Rails和Ember JS进行JWT身份验证

时间:2018-09-10 15:27:28

标签: ember.js oauth-2.0 jwt rails-api

使用JWT,Rails API和JS前端框架(例如Ember JS)时,执行用户注销操作的正确方法是什么?我实际上正在做的是:

  • 使用Rails 5.2作为API
  • 使用Ember JS 3.3作为前端
  • 使用Ember Simple Auth作为OAuth插件
  • example app是其 master 分支,可以根据需要运行
  • 示例应用its without login branch无法注销用户
  • 检查状态并在Rails API和Ember JS应用之间的每个请求中传递令牌。

我的问题是:

  • 我应该在后端模型中保留令牌值(例如,用户)吗? 我需要它在后台在后台发出另一个请求。

  • 当用户在后端注销时,我应该将令牌值设置为&boo吗?

  • 对于注销操作,ESA我在做什么?

  • 实际上,令牌值保留在客户端的cookie中(有关更多详细信息,请参见https://github.com/simplabs/ember-simple-auth)。我遵循了他们的指南和他们提供的dummy app

  • 我在Ember JS论坛上也有一个discussion,并尝试遵循一些提示和建议,但仍然没有成功。

谢谢。

1 个答案:

答案 0 :(得分:0)

此答案至少适用于Ember 1.13至3.x。

身份验证的方式多种多样,我认为正确的方法是后端易于理解的方式。

由于您的JWT位于cookie中,因此让我们将该cookie视为真相的来源。您可以定义一个具有以下功能的服务,而不是执行复杂的操作来解析模型挂钩中的cookie,该服务可以抓取cookie,对其进行解析,然后将结果保存为服务中的值或返回所需的值。

这为您带来一些好处。您可以从应用程序中的任何位置(包括适配器)获取值,所有用于身份验证的逻辑都放在一个地方。另一方面,您必须自己处理异步行为(即,如果路由依赖于具有登录信息,则必须管理身份验证和路由转换之间的操作顺序)。

Ember Simple Auth由于此问题而非常受欢迎。尽管Cookie中的JWT没有开箱即用的功能,但是如果您有一个基于登录行为具有不同状态的应用程序,那么学习它可能是一项不错的投资。

用户模型有点像介于手动服务和Ember Simple Auth之间的中间地带,因为您可以获得用户模型并在整个应用程序中都依赖它,并且在异步方面也获得了一些帮助。请注意不要将您的身份验证代码分散在整个应用程序中。

最后,要触发注销,我将创建一个通过设置最长使用期限/到期时间like this来销毁cookie的函数。如果要在服务上处理身份验证,则意味着可以使用Router Service,然后使用transitionTo登录页面。如果您使用的是Ember Simple Auth,则该功能可以进入自定义身份验证器的invalidate挂钩中。示例:

invalidate(){     this._super()     document.cookie =“ some_token_name =; expires =星期四,2013年12月18日12:00:00 UTC; path = /”     返回Promise.resolve();   }

最后,要传递令牌以验证请求,如果您使用的是Ember Data,则可以在适配器的headers method中轻松实现。