Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2018, 12:18
Новичок на форуме
Отправить личное сообщение для olimpset Посмотреть профиль Найти все сообщения от olimpset
 
Регистрация: 04.08.2018
Сообщений: 9

backend API Key
Изучаю архитектуру Rest API и тут встал вопрос. Есть два проекта (Node - backend и Angular (ts) - frontend). Они независимы друг от друга (на разный VPS серверах даже). Так вот, как идентифицировать запросы ssl (post, get, put, delete) от фронтенда. Ведь по логике, без идентификации из любого места можно будет делать запросы к API. И тут я подумал про API Keys, делать JWT ключ с секретом, который знает бэкенд, ключ с бесконечным сроком жизни. Или второй вариант, воспользоватся сервисом Auth0, читал что можно такое организовать.
Дело в том, что нужно разграничить роли. Естественно, если это доверенный, нами разработанный фронтенд, то он имеет больше прав и соответственно ему доступны все запросы API. В то время, если другой разработчик использует API, то доступ у него будет не ко всем роутам API. Хороша ли идея, воспользоватся в данном случае токенами jwt и хранить их в БД, если нужно отозвать API Key? Информации по данной теме немного нашел.
Ответить с цитированием
  #2 (permalink)  
Старый 07.08.2018, 13:42
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

olimpset,
Вот полный пример реализации на ноде защищенного API с использованием Auth0 https://scotch.io/tutorials/building...rn-backend-api
Ответить с цитированием
  #3 (permalink)  
Старый 09.08.2018, 14:18
Новичок на форуме
Отправить личное сообщение для olimpset Посмотреть профиль Найти все сообщения от olimpset
 
Регистрация: 04.08.2018
Сообщений: 9

Так, с Auth0 разобрался. Но есть ещё один вопрос. Яя значит создаю клиента в Auth0 (для своего сайта), и создаю ещё одного клиента, с урезанными правами, для тех, кто будет пользоваться моим API. Потом в БД буду генерировать API Key. И будут посылаться запросы к этим ключом от клиентов, и сервер будет запрашивать access токен у Auth0, используя для этого только один клиент, который с ограниченным правами. Правильно ли я мыслю? В двух словах. Нужно с помощью Auth0 сделать архитектуру: Мой клиент (сайт) с Макс правами, и клиент для остальных, внешних запросов к API, с ограниченными правами.
Ответить с цитированием
  #4 (permalink)  
Старый 09.08.2018, 15:18
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

olimpset,
Вы точно с Auth0 разобрались? Никакие API key вы не генерируете.
Вы создаете пользователей, наделяете их правами (указывая к каким scope он относится) и всё. Далее клиент посылает запрос на Auth0 сервис с необходимыми данными (NON_INTERACTIVE_CLIENT_ID, NON_INTERACTIVE_CLIENT_SECRET, grant_type, audience), Auth0 в ответ отсылает клиенту access_token, который он должен будет послать на ваш сервер в заголовке Authorization. Далее express-jwt модуль его расшифрует и в req.user отдаст вам пользователя. Теперь вы можете проверить его scope и решить, давать ли ему права на нужный URL.
Ответить с цитированием
  #5 (permalink)  
Старый 09.08.2018, 15:34
Новичок на форуме
Отправить личное сообщение для olimpset Посмотреть профиль Найти все сообщения от olimpset
 
Регистрация: 04.08.2018
Сообщений: 9

Это всё я понял и сделал, это работает. Но допустим, если много вебмастеров (допустим 10) захочет интегрировать на свой сайт некоторые функции моего API, тогда получается, для каждого нужно создать отдельный клиент в Auth0 (в сумме 10) и каждому грубо говоря, скинуть секрет его, id, и т.п, далее каждый вебмастер будет запрашивать свой access_token, посылая запрос Auth0. Правильно схему понял?
Ответить с цитированием
  #6 (permalink)  
Старый 09.08.2018, 17:55
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

olimpset,
Точно
Ответить с цитированием
  #7 (permalink)  
Старый 09.08.2018, 21:04
Новичок на форуме
Отправить личное сообщение для olimpset Посмотреть профиль Найти все сообщения от olimpset
 
Регистрация: 04.08.2018
Сообщений: 9

Я решил сделать проще. Что бы не создавать куча клиентов... будут только те клиенты в Auth0, которые являются личными (сайт, клиент на телефон) и имеют полный доступ. А для тех, кто хочет использовать API, не нужно будет никакой авторизации.
Где то так:
app.route('/api/', (req, res)) //Публичный роут, для внешних запросов.
app.route('/api', checkAccess, (req, res)) //Роут, доступный только для личного 
использования. (из своего сайта, своей программы на телефон).


Как мне кажется, это лучше, чем создавать много клиентов. Имеет ли место быть такое решение?
Ответить с цитированием
  #8 (permalink)  
Старый 10.08.2018, 06:57
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
Имеет ли место быть такое решение?
Да
Ответить с цитированием
  #9 (permalink)  
Старый 10.08.2018, 18:26
Новичок на форуме
Отправить личное сообщение для olimpset Посмотреть профиль Найти все сообщения от olimpset
 
Регистрация: 04.08.2018
Сообщений: 9

Отлично. Теперь назревает логический вопрос. Авторизацию реализовывать на бэкенд (с помощью passport) или же теперь можно создать в Auth0 клиент с типом SPA, а не машина к машине, прикрутить это все и на сервер при запросе API, отправлять токен и на сервере уже проверять по токену, авторизирован ли или нет ? В данном случае, на сервере не будет ничего лишнего выполнятся. Только запросы и проверка авторизации. А сама авторизация на клиенте.
Ответить с цитированием
  #10 (permalink)  
Старый 11.08.2018, 00:26
Новичок на форуме
Отправить личное сообщение для olimpset Посмотреть профиль Найти все сообщения от olimpset
 
Регистрация: 04.08.2018
Сообщений: 9

Неоднократно читал, что сам процесс авторизации в случае OpenID, (идентификация наверное на сервере должна быть) должен проходить на клиенте (фронтенд), и потом серверу вместе с запросами прикреплять access_token, и задача сервера лишь проверить это токен и решить, авторизирован аль нет. Теперь сомневаюсь, что нужно этот процесс (авторизацию) на сервере делать.
Как считаете?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jin: И снова о наследовании tenshi Ваши сайты и скрипты 16 19.08.2013 20:30
Борьба с Object.defineProperty в IE8 FINoM Оффтопик 46 04.09.2012 23:45
Object.predefinedProperties создает новый объект с назначенными getter'ами/setter'ами devote Ваши сайты и скрипты 13 06.03.2012 21:57
своё замыкание каждому объекту. cainrus Общие вопросы Javascript 40 25.10.2010 13:57
MVC vs API. Ваше мнение. B~Vladi Общие вопросы Javascript 58 19.10.2010 16:29