2016-12-25 32 views
2

我有一個單頁JavaScript應用程序,我使用Auth0服務進行註冊/登錄。如何檢測當前請求是否爲認證回調?

我已經將鎖部件和我保存用戶後的字符串localStorage進行身份驗證,像這樣:

lock.on("authenticated", function(authResult) 
{ 
    localStorage.setItem('login', authResult.idToken); 
} 

的問題是,當Auth0重定向他們回到我的應用程序在登錄後,authenticated事件僅在頁面加載後觸發,但到那時,我已經完成檢查以確定localStorage字符串是否已設置(不是);因此,用戶會越來越要求重新登錄:

if(localStorage.getItem('login') == undefined) 
{ 
    lock.show(function(err, profile, token) 
    { 
     // ... 
    } 
} 

我想看看是否有什麼特別的網頁通過回調之後 - 但是引用並不總是存在。

如果我不會自動提示用戶登錄,而是顯示登錄按鈕 - 由於某種原因,authenticated事件不會觸發。

我該如何解決這個問題?

回答

0

根據您提供的信息,您似乎在重定向模式下使用鎖定,如果出現這種情況,您可以使用hash_parsed event作爲了解Lock是否找到它將處理的響應的方法。

每當新的Auth0Lock對象以重定向模式(默認)初始化時,它都會嘗試解析URL的哈希部分,查找登錄嘗試的結果。之後,如果在散列中找不到任何內容,此事件將與null一起發出。如果出現問題,它將以與authenticated事件相同的參數發射,成功登錄後或使用與authorization_error相同的參數。

利用此事件,你可以做到以下幾點:

  1. 訂閱hash_parsed事件:
  2. 如果hash_parsed發出與nulllocalStorage沒有指示用戶已經登錄然後重定向到登錄。
  3. 如果hash_parsed以非空值發出,或者authenticatedauthorization_error將被髮射並且您可以做出相應的反應。

一些示例代碼:

lock.on("hash_parsed", function (response) { 
    if (!response && !localStorage.getItem('login')) { 
     // Redirect to the login screen 
    } else { 
     // Either the user is already logged in or an authentication 
     // response will be processed by Lock so don't trigger 
     // an automatic redirect to login screen 
    } 
}); 
+0

嗨若昂。我試過這個示例代碼,但它仍然以無限循環的方式請求登錄。登錄後,它會使用?code =參數重新加載頁面,但它不會得到正確或認證的處理。 – skunkwerk

+0

'?code ='的外觀表明您正在使用OAuth2授權代碼授權,這是爲服務器端Web應用程序處理的。如果您想要一個SPA來處理Lock處理認證響應,您需要使用隱式授權,以便在URL的散列片段('#...')中傳遞響應。 –

相關問題