代码之家  ›  专栏  ›  技术社区  ›  Jordan Messina

通过openid、oauth或facebook connect进行身份验证后重定向回页面

  •  3
  • Jordan Messina  · 技术社区  · 15 年前

    我允许用户使用openid、twitter oauth或fbconnect登录我的网站。如果用户试图转到要求其登录的页面,则在该用户登录后,我希望将其发送回该页面。有没有一个简单的方法来完成所有这些,或者我应该只是写重定向页面到一个cookie,并在一个成功的登录发送到该页面?我用的是django,所以如果有什么好的技巧或技巧特别涉及到这一点,那就太好了。

    感谢您的提前输入!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Marcel Jackwerth    15 年前

    不幸的是,oauth和openid并没有真正了解您的应用程序状态(而oauth wrap可以)。所以你必须采取以下假设:

    • 用户将在不切换选项卡/窗口或在您的站点上执行其他请求的情况下完成登录。

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

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

    如果用户违反了假设,这将导致奇怪的行为,但我不认为有任何方法可以绕过这一点。

        2
  •  2
  •   keturn    15 年前

    您可以将该参数(它们所在的页面)作为 return_to . 如中所述 the spec :

    注意: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)发送,并在他们返回时查找它。

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