如何在不同窗口中实现OAuth流程并重新加载调用窗口

3 投票
1 回答
1754 浏览
提问于 2025-04-17 13:24

我正在尝试用一个Google App Engine应用来实现这个功能,使用OAuth 2.0来授权访问Google日历(只限于Google Apps域的用户)

  1. 如果用户还没有授权这个应用访问他们的日历,就显示一个“用你的Google Apps账户授权这个应用”的按钮。
  2. 当用户点击这个按钮时,打开一个新窗口,开始授权过程(这个网址的格式是 https://accounts.google.com/o/oauth2/auth?state=CALLER_URL&redirect_uri=CALLBACK_URL&response_type=code&client_id=CLIENT_ID&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar&access_type=offline)
  3. 用户授权应用访问他们的日历后,这个窗口会关闭,原来的窗口会重新加载,以显示应用

第一步非常简单。第二步也差不多。我可以在新窗口中打开那个网址,但接下来的过程都是在那个新窗口里进行的。我的意思是:当用户授权应用后,网址会返回到回调地址,但是在新窗口中,而不是在原来的窗口里

有没有办法做到这一点?我在很多网站上见过。你点击一个按钮,打开一个新窗口,让原来的应用获得访问你的数据的授权(比如Twitter账户、Facebook动态、Google联系人……等等),然后那个窗口关闭,原来的窗口重新加载,带着所需的授权令牌,准备好工作。

1 个回答

4

你肯定希望它能返回到子窗口。这没问题,因为父窗口和子窗口之间是可以互相沟通的。比如说:

  1. 一些JavaScript代码打开了子窗口,并把它的地址设置为Google授权页面。
  2. 当用户接受对话框时,子窗口会被转到你的回调网址。
  3. 你的服务器保存从转发的网址中获取的令牌数据(它并不知道也不关心请求是从哪个窗口发出的)。
  4. 服务器返回一个页面,这个页面会在子窗口中加载。
  5. 这个页面是空白的,但里面有一些JavaScript代码,会提醒底层页面并关闭窗口。

比如,这段JavaScript代码可能长这样:

window.parent.location.reload();
window.close();

撰写回答