2016-10-14 2 views
0

Я использую ember-simple-auth и torii для обработки аутентификации OAuth2 на стороне клиента Facebook и Google в приложении Ember, которое я создаю. Я получаю код авторизации от этого процесса.Как обменять коды авторизации OAuth2 для токенов доступа, полученных от клиента (Ember) в Express?

Я хочу отправить этот код от клиента в свой REST API и обменять его на токены доступа, чтобы получить их идентификатор пользователя, чтобы я мог выяснить, к какой информации они должны иметь доступ.

Затем я хочу поместить идентификатор пользователя в веб-маркер JSON, который клиент может отправить мне в последующих запросах на данные из приложения BE.

Моя проблема: Все примеры, которые я нашел использования паспорта для проверки подлинности oauth2 полагаться на перенаправление пользователя на стороне сервера и с помощью функции обратного вызова, а не только обмен уже предоставленный код авторизации.

Что мне не хватает? Это похоже на то, что нужно сделать многим приложениям.

ответ

0

Предполагая, совместимые реализации OAuth 2.0, обмениваясь кодом авторизации для маркеров доступа осуществляется путем выполнения POST запроса маркеров конечной точки URL и предоставляя следующие параметры, используя формат application/x-www-form-urlencoded:

  • grant_type - Must установить на authorization_code.
  • code - Будет содержать значение кода, который у вас есть.
  • redirect_uri - Должно быть включено, а значение соответствует, если оно также было включено в запрос для получения авторизационного кода.

Кроме того, в зависимости от клиента вы должны либо предоставить параметр client_id, если клиент не был выдан учетные данные или если клиент имеет учетные данные необходимо выполнить аутентификацию клиента, который может быть сделано путем передачи HTTP Основной заголовок проверки подлинности, содержащий идентификатор и секрет.

Например, при использовании unirest, но легко адаптировать к другим клиентам HTTP:

unirest.post(tokenEndpointUrl) 
    .headers({ 
     'Accept': 'application/json', 
     'Content-type': 'application/x-www-form-urlencoded' 
    }) 
    .auth({ 
     user: clientId, 
     pass: clientSecret 
    }) 
    .send(`redirect_uri=${redirectUrl}`) 
    .send(`code=${code}`) 
    .send('grant_type=authorization_code') 
    .end(function (response) { 
     // Handle response 
    }); 

Хотя основы, вероятно, не изменятся, проверить каждую документацию поставщика, поскольку они могут иметь расширение положить на месте или быть более гибкими в том, как вы можете предоставить информацию. Например, Auth0, и я думаю, что Google будет таким же, вы также сможете передавать параметры в закодированном JSON-блоке, а не только в формате application/x-www-form-urlencoded.


Update:

Конкретные провайдеры аутентификации могут реализовать дополнительные библиотеки, которые упрощают вещи для разработчиков, интегрирующих с ними. Например, Auth0 предоставляет вам passport-auth0, который абстрагирует и упрощает способ интеграции аутентификации Auth0 в ваше приложение.

+0

Я вижу, интересно. Есть ли способ справиться с этим «волшебным образом» с использованием паспорта или какой-либо другой структуры? то есть предоставить мой идентификатор/секрет нескольким провайдерам, а затем просто передать им код авторизации и вернуть токен доступа? –

+0

Обновлен вопрос на примере API более высокого уровня, но обычно это зависит от поставщика, которого вы используете. –

Смежные вопросы