通过OpenID,Oauth或Facebook Connect进行身份验证后重定向回页面

时间:2010-02-09 21:48:28

标签: authentication openid facebook oauth

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

感谢提前输入!

2 个答案:

答案 0 :(得分: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数据),或者您有一个非常长的网址,您无法将其作为查询参数,或者您需要destination_url被篡改用户,您将该信息存储在服务器端,将密钥作为查询参数而不是URL发送,并在他们返回时查找。

与在会话中存储它没有什么不同,除非用户在一个会话中有多个同时的选项卡运行到此,然后在查询中使用它有帮助。

答案 1 :(得分:1)

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

  • 用户将完成登录,无需切换标签/窗口或在您的网站上执行其他请求。

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

  1. 检测到受保护站点的访问权限后,将完整查询存储在会话中。如果这是一个POST请求,这根本不起作用,你必须为这个问题做好准备(向他们展示一个他们必须首先登录的警告网站。)
  2. 存储此请求何时发生的时间戳。
  3. 在OpenID回调中检查是否设置了会话变量,并将用户重定向到存储的查询。检查时间戳(如果时间戳超过5分钟左右,请不要重定向)。之后清除会话中的两个变量。
  4. 如果用户违反了这个假设,这将导致奇怪的行为,但我认为你没有任何办法可以规避这一点。