2016-12-25 55 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的散列片段('#...')中传递响应。 –

相关问题