2016-03-13 26 views
2

我的Ember應用程序中有一個基本的工作身份驗證系統。我可以收到JWT,我的應用程序會將我登錄。問題是我無法訪問類似0123er的任何內容,如ember-simple-auth的GitHub頁面上的示例所示。無法使用embre-simple-auth-token訪問會話屬性和JWT聲明

下面是從我的認證請求的響應:

{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的特定身份驗證器,所以我認爲它應該能夠讀取該令牌。

回答

4

你可以得到的解碼負荷是這樣的:

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

這是談到in this issue

UPDATE

在這個剛纔看了一遍又意識到,我可能會誤解你了。 我上面提到的方法是如何解碼來自令牌的聲明,但是,這不是如何從模板/路線等訪問聲明。

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); 
    } 
    } 
}); 

希望這更是你所期待的。

+0

不幸的是,這只是實現我的目標的另一種複雜方式。爲什麼我不能只做'this.get('session')。get(something)'來獲得我的JWT的聲明?它不應該是一個基本的功能? –

+0

剛剛添加了一個更新,我認爲更多的是你之後:) – Subtletree