0

У нас запущена стандартная настройка MEAN - угловая для рендеринга интерфейса, node.js (express) в качестве сервера. Статические ресурсы HTML/Javascript передаются с узла без проверки подлинности. Все данные, отображаемые в интерфейсе, запрашиваются Угловым из узла. Угловое разрешение пользователя на конечные точки узла путем подачи токена-носителя JWT в заголовке «Авторизация» запросов ajax.Обратный вызов API Google на сервере REST без состояния

Это работает отлично, но я в тупике, когда речь идет об интеграции API Google OAuth2 в этой настройке. Цель состоит в том, чтобы отобразить данные календаря пользователя в веб-приложение:

  1. Угловые запросы /API/календари от узла подачи носителя маркера в заголовке запроса.
  2. Если у сервера нет токена доступа Google для этого пользователя, он создает URL-адрес маркера Google (включая callbackUrl/api/calendars/googleCallback) и отправляет его обратно в Angular.
  3. Когда «Угловой» получает в качестве ответа вместо данных календаря значение tokenRequest-Url, он перенаправляет пользователя на этот URL-адрес, где он вручную предоставляет разрешение webapp.
  4. Google перенаправляет адрес обратного вызова, предоставляя код доступа.

Проблема шаг 4 - как сервер узла является лицом без гражданства и перенаправлять от Google для /API/календари/googleCallback код = XYZ не содержит авторизации заголовка сервер не может определить, не говоря уже о аутентифицировать к которому принадлежит предоставленный код доступа.

Динамическое добавление какого-либо хэша, идентифицирующего пользователя для URL-адреса обратного вызова, не работает (и, похоже, небезопасно), поскольку Google принимает только предварительно заданные фиксированные URL обратного вызова. Я мог хранить идентификацию пользователя в cookie, но это похоже на нарушение общего подхода JWT.

Вопрос будет, если описанный выше поток в общем случае является плохой идеей или если есть лучшие практики для решения этой ситуации, чтобы позволить серверу определять, к какому пользователю относится запрос на обратный вызов.

Спасибо!

ответ

0

Хорошо - проглядели простое решение:

Используйте состояние параметров в лексем запроса, который маршруты Google через и присоединяет к CallBackURL: https://developers.google.com/accounts/docs/OAuth2Login#state-param

В узле:

var googleApi = require('googleapis'); 
var oauth2Client = new googleApi.auth.OAuth2(config.clientId, config.clientSecret, config.callbackUrl); 

var options = { 
    access_type: 'offline', 
    state: 'hashed-useridentified', 
    scope: [ 
     'https://www.googleapis.com/auth/calendar.readonly' 
    ].join(' ') 
}; 
oauth2Client.redirectUri_ = 'http://someserver.com/api/auth/google/calendar/callback'; 
var generatedUrl = oauth2Client.generateAuthUrl(options); 
Смежные вопросы