无法使用embre-simple-auth-token

时间:2016-03-13 17:09:04

标签: ember.js jwt ember-simple-auth

我的Ember应用程序中有一个基本的工作认证系统。我可以收到一个JWT,我的应用程序会登录。问题是我无法使用this.get('session').get('data.id')访问任何内容,如ember-simple-auth的GitHub页面上的示例所示

这是我的身份验证请求的响应:

{token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiY…yMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A", test: "abc123"}

这里是令牌的有效负载:

{
  "id": "abc123"
}

然而,调用this.get('session').get('data.id')并不会返回任何内容。我还尝试过this.get('session').get('id')等其他内容。

this.get('session').get('data')返回:

{"authenticated":{"authenticator":"authenticator:jwt","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYzEyMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A","test":"abc123"}}

因此,技术上有一种方法可以阅读test,但它看起来并不是正确的方法。

this.get('session')存在,但是空的。设置属性工作正常,之后可以访问它们。

如何查看声明? ember-simple-auth-token有一个特定的JWT验证器,所以我认为它应该能够读取令牌。

1 个答案:

答案 0 :(得分:4)

你可以像这样得到解码的有效载荷:

JSON.parse(atob(this.get('session.data.authenticated.token').split('.')[1]))

有人谈到in this issue

<强>更新

再次看着这个,意识到我可能误解了你。 我上面提到的方法是如何解码来自令牌的声明,但是这不是你如何从模板/路线等访问声明。

Here is a good blog post显示了如何更轻松地获取声明。

基本上每当用户通过身份验证时,都会在会话中添加一个属性,允许像this.get('session.claims.id')一样访问权限。

在博文中,用户从api获取并保存为session.account。如果您只想将声明直接从令牌设置到会话,则可以执行以下操作:

服务/会话account.js

import Ember from 'ember';
const { inject: { service }, RSVP } = Ember;
export default Ember.Service.extend({
  session: service('session'),
  store: service(),
  loadCurrentUser() {
    const token = this.get('session.data.authenticated.token');
    if (!Ember.isEmpty(token)) {
      var claims = JSON.parse(atob(token.split('.')[1]));
      this.set('session.claims', claims);
    }
  }
});

希望这更像是你在寻找的东西。