如何通过在新窗口中打开而不是从当前页面重定向用户来进行OAuth请求?

46

我已经在Twitter和Facebook上完成了OAuth认证。目前,对于这些网站的每一个,我的服务器将用户重定向到指定的URL(例如,http://api.twitter.com/oauth/authorize 对于Twitter),然后通过回调URL接收身份验证参数。

但是这种方式会将用户重定向到我的页面之外(到Facebook或Twitter),只有在输入正确的用户名和密码后才会返回。这就像当用户尝试发布推文时http://techcrunch.com所做的那样。

我记得在一些网站上,我们不必重定向用户,而是打开一个弹出窗口供用户输入凭据。认证完成后,弹出窗口关闭,主页面刷新并显示新内容。

这可能是一个非常简单的任务,使用javascript即可实现,但我仍然无法想出来。我可以在弹出窗口中打开身份验证URL,但如何获取结果并更新主页面呢?

2个回答

77

假设您正在使用window.open()在弹出窗口中打开认证URL,您可以通过以下方式访问父窗口:

window.opener

要从弹出窗口重新加载父窗口,请使用以下代码:

window.opener.location.reload();

window.opener.location.reload();

这段代码应该被放置在你已经设置为OAuth授权成功回调URL的网址上。

一般来说,流程应该是:

  • 打开一个带有授权页面的弹出窗口(例如在twitter.com上)
  • 在用户成功授权之后,Twitter会将用户重定向到你提供的URL(它会在同一个弹出窗口中打开)
  • 开启窗口重新加载(通过 window.opener.location.reload()
  • 关闭弹出窗口本身(如果需要使用JavaScript)

1
你的意思是我要在弹出窗口中放置JavaScript来实现这个吗? - Hoàng Long
10
是的,在弹出窗口中,在oauth授权成功回调页面上。所以流程是:您打开一个带有授权页面的弹出窗口(例如在twitter.com上),在成功授权后,Twitter会将用户重定向到您提供的URL(它会在同一个弹出窗口中打开),在该回调页面上,您可以插入来自我的答案的JavaScript,opener窗口重新加载,然后您可以使用JavaScript轻松关闭弹出窗口。 - WTK

0

我有一个后续问题:从Twitter实现的角度来看,我们是在新窗口还是同一窗口打开授权页面是否重要?我的意思是,如果他们必须将我重定向到新窗口(我已经为授权页面打开了新窗口),与他们必须将我重定向到同一窗口(如果我没有为授权页面打开新窗口)相比,Twitter的实现会发生变化吗?


嗨,@ankur rawat,我认为Twitter的实现不会改变 - 无论是主窗口还是弹出窗口,他们始终会将调用重定向回调用者页面(我假设他们没有改变实现细节,这是10年前我提出这个问题的情况)。 - Hoàng Long
1
只是提醒一下,答案帖子并不是进一步提问的正确场所。我知道您可能还没有评论的权限,但建议您下次打开一个新问题来询问 - 您可以在新问题中引用被引用的问题作为 URL。 - Hoàng Long
由于您目前的答案写得不够清晰,请[编辑]以添加更多细节,帮助其他人了解这如何回答所提出的问题。您可以在帮助中心中找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接