2016-07-09 35 views
1

我正在使用前端的角JS SDK開發環回JS應用程序。我有一個模型的查找遠程方法的後鉤,它驗證當前上下文是否有訪問令牌。即使用戶登錄,Loopback也會拋出accessToken undefined

Team.afterRemote('find',function(context,boards,next){ 
     var ExeboardUser = app.models.ExeboardUser; 
     var ExeboardUserBoard = app.models.ExeboardUserBoard; 


     var ctx = loopback.getCurrentContext(); 

     var at = ctx.get('accessToken'); 
     if(at==undefined || at==null){ 
     // return 401 
     console.log("Unauthorized: Find Boards-User not logged in."); 
     var newError = new Error("Unauthorized: Find Boards"); 
     newError.status = 401; 
     next(newError); 
     } 
     else{ 
     //.. more verifications and operations on the data 
     } 

    }); 

此驗證效果很好....有時。我遇到的問題是,在隨機時間我得到一個401未經授權,因爲回送得到一個未定義的訪問令牌。即使我已經登錄,也會發生這種情況,如果我再次發送請求,令牌會奇蹟般地再現並授予權限。

我不知道如何複製每次這個錯誤。我只知道它發生(有時),如果我離開會話iddle 5-10分鐘,或者如果我正在對前端進行更改,並且我會刷新。

在angularJS上,我在控制器的開始處調用端點。這意味着只要用戶輸入具有控制器的url,就會發出請求。

var getTeam = function(){ 
    Team.find({filter:{where:{ id:$stateParams.id }}}) 
    .$promise 
    .then(function(response){ 
     $log.log("SUCCESS",response); 

     }, 
     function(err){ 
     $log.log(err); 
     }); 
}; 

我不明白的是爲什麼它有時會發生,有時不會發生。任何人都可以幫助我發現錯誤?

+1

這與你的問題沒有關係,但是在'if(at == undefined || at == null){'你只需要檢查undefined *或* null,而不是兩個,因爲等寬鬆算法。 – gcampbell

+0

好的。感謝您對代碼的更正:) –

回答

0

取而代之的是遠程鉤子,你應該在你的模型中使用下列ACL:

{ 
    "accessType": "EXECUTE", 
    "principalType": "ROLE", 
    "principalId": "$unauthenticated", 
    "permission": "DENY", 
    "property": "find" 
} 
+0

感謝您的回答。但我仍然需要鉤子上的令牌來獲取currentUserId並進行額外檢查 –

+0

夠公平,我仍然會推薦使用loopback.token()中間件,而不是將它放在遠程鉤子中,但是我想如果您只需要檢查在一個有用的功能上。如果你能縮小問題的根源,你可以在GitHub上的LoopBack回購上發佈嗎?在評論中提到我(@richardpringle),我會確保有人進一步研究它。 – richardpringle

0

可否請您檢查以下項目?

  1. server.js文件中令牌和上下文中間件的順序。我有這樣的順序:

    app.use(loopback.context()); 
    app.use(loopback.token()); 
    
  2. 入住控制檯知道存儲的訪問令牌,localStoragesessionStorage的位置。當您關閉瀏覽器選項卡時,將刪除sessionStorage

我不能使用評論功能,但因爲我的聲望還不是50 :)。道歉,如果這看起來更像評論。

相關問題