如何使用弹出窗口对第三方服务进行身份验证?

时间:2016-05-27 16:36:04

标签: javascript authentication oauth popup

在尝试与Google,LinkedIn,Facebook等进行身份验证时,我遇到了一个问题。身份验证需要在弹出窗口中完成(客户端请求它),但是在我打开弹出窗口后,我失去了对它的控制权,无法与授权完成的主窗口进行通信。

以下是详细情况:

  1. 用户点击主窗口中的“使用Google登录”按钮。

  2. 主窗口使用var popup = window.open('http://example.com/login/google')打开我正在托管的护照路径的弹出窗口。

  3. 如果用户未批准我的网站访问其帐户,则弹出窗口的网址会自动更改为http://google.com/OAuth2/。此重定向由我正在使用的护照组件(koa-passport)完成。

  4. 用户批准登录,弹出窗口的URL重定向到http://example.com/login/google/callback,其中包含授权令牌。这是我的护照回调路由在我的数据库中注册用户并创建授权令牌的地方。

  5. 问题是此时用户主窗口和弹出窗口都打开了,我无法通知主窗口弹出窗口完成身份验证。弹出窗口需要自动关闭,主窗口需要将用户带到他们的私人主页。

    我尝试在主窗口中创建一个全局函数,但在最后的重定向之后,弹出窗口无法访问其父窗口的全局窗口对象。我考虑过从主窗口向弹出窗口发送消息以共享它们之间的全局上下文,但问题是弹出窗口重定向到Google(或其他一些身份验证提供程序),并且当它重定向回到我的时候回调网址会忘记此上下文。

    我找到的唯一方法是在主窗口中设置一个计时器并监视弹出窗口的URL,但这看起来很糟糕。是否有其他方式弹出窗口可以通知主窗口用户已登录?

0 个答案:

没有答案