【问题标题】:Redirecting back to a page after authentication through OpenID, Oauth, or Facebook Connect通过 OpenID、Oauth 或 Facebook Connect 进行身份验证后重定向回页面
【发布时间】:2011-01-15 00:33:01
【问题描述】:

我允许用户使用 OpenID、Twitter OAuth 或 FBConnect 登录我的网站。如果用户尝试访问需要他们登录的页面,则在该用户登录后,我想将他们发送回该页面。有没有一种简单的方法来完成所有这些操作,或者我应该只是将重定向页面写入 cookie 并在成功登录后将它们发送到该页面?我正在使用 Django,所以如果有任何好的提示或技巧特别涉及,那就太好了。

感谢您提前输入!

【问题讨论】:

    标签: authentication openid facebook oauth


    【解决方案1】:

    遗憾的是,OAuth 和 OpenID 并不真正了解您的应用程序状态(而 OAuth WRAP 可以)。所以你必须采取以下假设:

    • 用户无需切换选项卡/窗口或在您的网站上执行其他请求即可完成登录。

    然后您可以执行以下操作:

    1. 一旦检测到对受保护站点的访问,请将完整查询存储在会话中。如果是 POST 请求,这根本行不通,您必须为这个问题做好准备(向他们显示一个警告站点,并注明他们必须先登录)。
    2. 存储此请求发生时间的时间戳。
    3. 在您的 OpenID 回调中检查是否设置了会话变量并将用户重定向到存储的查询。检查时间戳(如果时间戳超过 5 分钟左右,则不要重定向)。之后从会话中清除这两个变量。

    如果用户违反假设,这将导致奇怪的行为,但我认为没有任何方法可以规避它。

    【讨论】:

    • 我认为这是唯一的解决方案,这很糟糕,但很好。感谢您的意见。
    • 这不准确。 OAuth WRAP 并不比 OAuth 或 OpenID 更具有状态感知能力。这三个都有回调URL的概念(WRAP也有状态参数),回调URL可以用来保存状态。
    • 确实 - OpenID 应该可以工作,但是大多数网站(包括 Twitter)需要固定的 OAuth 回调 URL。 WRAP 在添加状态参数时允许固定回调 URL。
    【解决方案2】:

    您可以将该参数(他们所在的页面)作为参数传递给您的return_to。如the spec中所述:

    注意:return_to URL 可以用作依赖方将有关身份验证请求的上下文附加到身份验证响应的机制。本文档没有定义 RP 可以确保查询参数不被外部方修改的机制;这种机制可以由 RP 自己定义。

    例如:

    def sendOpenIDCheck(...):
        # after getting an AuthRequest from Consumer.begin
        return_to = oidutil.appendArgs(return_to,
            {'destination_url': that_place_they_tried_to_go})
        return redirect(auth_request.redirectURL, realm, return_to))
    
    
    def handleReturnTo(request):
       # after doing Consumer.complete and receiving a SuccessResponse:
    
       return redirect(request.GET['destination_url'])
    

    如果您需要跟踪某些其他状态(例如 POST 数据),或者您有一个非常长的 URL,您无法将其作为查询参数,或者您需要将 destination_url 篡改用户,您将该信息存储在服务器端,将密钥作为查询参数而不是 URL 发送,并在他们返回时进行查找。

    与将它存储在会话中没有太大区别,除非用户在一个会话中同时有多个选项卡运行到此,然后将其放在查询中会有所帮助。

    【讨论】:

    • 回调 URL 是放置此信息的最佳位置,正如 keturn 所说。这样,登录体验本身就会跟踪用户想去的地方,因此会话状态不会进入错误的身份验证尝试并将用户带到他不想去的地方。
    • 似乎不再起作用,至少在使用 google open id 时。
    猜你喜欢
    • 2018-04-12
    • 2016-08-27
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2011-09-09
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多