Как реализовать процесс oauth в другом окне, а затем перезагрузить окно вызывающего абонента

Я пытаюсь сделать это с помощью приложения Google App Engine, используя OAuth 2.0 для авторизации Календаря Google (только для пользователей домена Google Apps)

  1. Если пользователь еще не разрешил приложению доступ к своему календарю, покажите кнопку «Авторизовать это приложение с помощью вашей учетной записи Google Apps».
  2. Когда пользователь нажимает эту кнопку, открывается новое окно, где начинается процесс авторизации (URL-адрес имеет форму 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. Пользователь разрешает приложению доступ к своему календарю, а затем это окно закрывается, а окно вызывающего объекта перезагружается, чтобы отобразить приложение.

Шаг 1 очень прост. Шаг 2 вроде как. Я могу открыть этот URL-адрес в новом окне, но тогда остальная часть процесса происходит в этом новом окне. Я имею в виду: когда пользователь авторизует приложение, URL-адрес возвращается в uri обратного вызова, но в том же окне, а не в окне вызывающего абонента.

Есть какой-либо способ сделать это? Я видел на других сайтах. Вы нажимаете кнопку, открывается новое окно, чтобы дать приложению вызывающего абонента разрешение на доступ к вашим данным (аккаунт Twitter, стена Facebook, контакты Google... что угодно), а затем это окно закрывается, и окно вызывающего абонента перезагружается с необходимыми данными. токен авторизации и готов к работе


person Carlos Azaustre    schedule 23.01.2013    source источник


Ответы (1)


Вы определенно хотите, чтобы он отправил обратно в дочернее окно. Это не проблема, потому что родительские и дочерние окна могут обмениваться данными. Так, например:

  1. Некоторые JS открывают дочернее окно и устанавливают его местоположение на странице авторизации Google.
  2. Когда пользователь принимает диалог, дочернее окно перенаправляется на ваш URL-адрес обратного вызова.
  3. Ваш сервер сохраняет данные токена, которые он получает из переадресованного URL-адреса (он не знает и не заботится о том, из какого окна пришел запрос)
  4. Сервер возвращает страницу, которая загружается в дочернем окне.
  5. Эта страница пуста, но содержит некоторый javascript, который предупреждает основную страницу и закрывает окно.

Например, javascript может выглядеть так:

window.parent.location.reload();
window.close();
person Community    schedule 23.01.2013
comment
Большое спасибо за ответ Исаак! Я выполнил следующие шаги, но моя проблема в том, что я использую декоратор python @oauth2_decorator.oauth_aware, и мне нужно изменить URL-адрес обратного вызова на определенный URL-адрес, потому что в этот момент мое приложение загружает URL-адрес, откуда он был вызван. Можно ли изменить URL-адрес обратного вызова? Спасибо! - person Carlos Azaustre; 23.01.2013
comment
Я не уверен, что понимаю ваш вопрос (особенно часть о загрузке URL-адреса, откуда он был вызван), но вы можете изменить URL-адрес обратного вызова при создании экземпляра декоратора: OAuth2Decorator(callback_path='/some/path', ...), а затем зарегистрировать этот URL-адрес в Google в консоли API. - person ; 24.01.2013
comment
Еще раз спасибо за ваш ответ Исаак. Вы мне очень помогли! - person Carlos Azaustre; 25.01.2013