【问题标题】:How to detect that the current request is an authentication callback?如何检测当前请求是身份验证回调?
【发布时间】:2017-01-03 19:46:52
【问题描述】:

我有一个单页 JavaScript 应用程序,我正在使用 Auth0 服务进行注册/登录。

我已集成 Lock 小部件,并在用户通过身份验证后将字符串保存到 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 事件由于某种原因永远不会触发。

我该如何解决这个问题?

【问题讨论】:

    标签: oauth-2.0 single-page-application auth0


    【解决方案1】:

    根据提供的信息,您似乎在重定向模式下使用 Lock,如果是这种情况,您可以使用 hash_parsed event 作为了解 Lock 是否找到将处理的响应的方法。

    每次在重定向模式(默认)下初始化一个新的 Auth0Lock 对象时,它都会尝试解析 URL 的哈希部分,寻找登录尝试的结果。之后,如果在散列中找不到任何内容,此事件将与 null 一起发出。成功登录后,它将使用与authenticated 事件相同的参数发出,如果出现问题,它将使用与authorization_error 相同的参数发出。

    利用此事件,您可以执行以下操作:

    1. 订阅hash_parsed事件:
    2. 如果hash_parsed 与null 一起发出,并且localStorage 没有表明用户已经登录,则重定向到登录。
    3. 如果hash_parsed 以非空值发出,则authenticated 或authorization_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
        }
    });
    

    【讨论】:

    • 嗨乔奥。我尝试了这个示例代码,但它仍然以要求登录的无限循环结束。登录后,它会使用 ?code= 参数重新加载页面,但它没有得到正确处理或验证。
    • ?code= 的出现表明您正在使用 OAuth2 授权代码授予,该授权代码授予旨在让服务器端 Web 应用程序处理。如果您需要 Lock 处理身份验证响应的 SPA,则需要使用隐式授权,以便在 URL 的哈希片段 (#...) 中传递响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2016-07-09
    • 2014-01-15
    相关资源
    最近更新 更多