无法使用 embre-simple-auth-token 访问会话属性和 JWT 声明
Session properties and JWT claims can't be accessed with embre-simple-auth-token
我的 Ember 应用程序中有一个基本的工作身份验证系统。我可以收到一个 JWT,我的应用程序将让我登录。问题是我无法使用 this.get('session').get('data.id')
之类的内容访问任何内容,如 ember-simple-auth 的 [=38= 上的示例所示] 页。
这是我的身份验证请求的响应:
{token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiY…yMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A", test: "abc123"}
这是令牌的有效载荷:
{
"id": "abc123"
}
然而,调用 this.get('session').get('data.id')
并没有 return 任何东西。我还尝试了其他东西,比如 this.get('session').get('id')
.
this.get('session').get('data')
returns:
{"authenticated":{"authenticator":"authenticator:jwt","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYzEyMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A","test":"abc123"}}
所以在技术上有一种阅读方式 test
但它似乎不是正确的方式。
this.get('session')
存在,但为空。设置属性效果很好,之后可以访问它们。
如何访问声明? ember-simple-auth-token 有一个特定的 JWT 验证器,所以我认为它应该能够读取令牌。
你可以这样得到解码后的payload:
JSON.parse(atob(this.get('session.data.authenticated.token').split('.')[1]))
其中谈到in this issue.
更新
刚刚又看了一遍,意识到我可能误会了你。
我上面提到的方法是如何从令牌中解码声明,但这不是您从 templates/routes 等访问声明的方式。
Here is a good blog post 展示了如何使声明更易于访问。
基本上,每当用户通过身份验证时,都会将 属性 添加到会话中,允许像 this.get('session.claims.id')
.
一样访问声明
在博客 post 中,从 api 中获取用户并保存为 session.account
。如果您只想将声明直接从令牌设置到会话,您可以这样做:
services/session-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);
}
}
});
希望这就是您想要的。
我的 Ember 应用程序中有一个基本的工作身份验证系统。我可以收到一个 JWT,我的应用程序将让我登录。问题是我无法使用 this.get('session').get('data.id')
之类的内容访问任何内容,如 ember-simple-auth 的 [=38= 上的示例所示] 页。
这是我的身份验证请求的响应:
{token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiY…yMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A", test: "abc123"}
这是令牌的有效载荷:
{
"id": "abc123"
}
然而,调用 this.get('session').get('data.id')
并没有 return 任何东西。我还尝试了其他东西,比如 this.get('session').get('id')
.
this.get('session').get('data')
returns:
{"authenticated":{"authenticator":"authenticator:jwt","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYzEyMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A","test":"abc123"}}
所以在技术上有一种阅读方式 test
但它似乎不是正确的方式。
this.get('session')
存在,但为空。设置属性效果很好,之后可以访问它们。
如何访问声明? ember-simple-auth-token 有一个特定的 JWT 验证器,所以我认为它应该能够读取令牌。
你可以这样得到解码后的payload:
JSON.parse(atob(this.get('session.data.authenticated.token').split('.')[1]))
其中谈到in this issue.
更新
刚刚又看了一遍,意识到我可能误会了你。 我上面提到的方法是如何从令牌中解码声明,但这不是您从 templates/routes 等访问声明的方式。
Here is a good blog post 展示了如何使声明更易于访问。
基本上,每当用户通过身份验证时,都会将 属性 添加到会话中,允许像 this.get('session.claims.id')
.
在博客 post 中,从 api 中获取用户并保存为 session.account
。如果您只想将声明直接从令牌设置到会话,您可以这样做:
services/session-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);
}
}
});
希望这就是您想要的。