Как реализовать одновременный доступ к API пользователя и мобильного приложения?
Здравствуйте.
Мне необходим API, к которому будет обращаться мобильное приложение, которое будет обслуживать CRM-систему с передником на React.
Вход пользователя в CRM реализован с помощью JWT Auth0. Пользователь зашел, попадает на главную страницу, просмотр которой разрешен всем вошедшим пользователям, вне зависимости от прав доступа. Если у пользователя есть права, он может дальше бороздить просторы CRM, если нет, то нет. Тут все ясно. А что, если есть приложение, административное, доступное только определенному кругу лиц. Нужно, чтобы оно обращалось к API и имело доступ ко всему, как это реализуется, создается роль со всеми правами, которая называется, к примеру, app. Но как быть в таком случае с аутентификацией? Если пользователя кидает на страницу входа, то как быть с приложением? Оно ведь всегда одно и то же, оно одно. Необходимо прямо дать ему разрешения для доступа без аутентификации, без заморочек, даже можно без JWT... Или не можно? Каков механизм входа для доступа к API для приложения?
Антон Спирин
Возможно, сумбурно, да...
По-другому. Если есть приложение, которое должно иметь монопольный доступ (ко всем функциям) к API, а API требует access token и проверяет права доступа, то как реализуется в данном случае доступ приложения к API. Понятно, что надо выполнить каким-то образом "вход" (не понимаю механизм, это не живой пользователь, форму логина не покажешь) и потом слать access token с каждый запросом (а еще обновлять его, повторно производить входи и т.д.). Но по логике вещей авторизовывать приложение нет смысла (делать, чтобы оно работало по классической схеме с JWT, это больше про пользователей), надо бы, чтобы оно всегда было авторизовано, т.к. других таких нет, этот "пользователь" единственный и он точно имеет право.
Как предположение - может, не заморачиваться, не проводить аутентификацию приложения, и с любым запросом просто передавать, как некий паспорт, сообщающий о том, что приложение имеет право:
Где secret=sha1(get+param1+param2+param3+timestamp+secretSalt).
При получении на сервере запроса проверять secret, что даст понять, что запрос от доверенного субъекта. Чтобы сильно ограничить возможность повторного использования подобного запроса в случае перехвата и не вести базу данных, взять за данность, что каждый запрос жив 5 секунд, т.е. при получении проверять timestamp, и если запрос еще свежий, то отдавать данные. Банки в своих API используют такую схему обмена данными (правда с сохранением всех запросов в базе и с проверкой).
Но в случае с приложением, которое обращается к API - это нормальная практика или я изобретаю велосипед и есть какие-то типовые, наработанные временем, решения, best practices? Придумать-то как сделать - не проблема. Нужно расширить кругозор, чтобы не было лишней самодеятельности.
А в чем проблема?
У вас, судя по тексту, уже есть разделение пользователей по ролям и в зависимости от роли, пользователю доступен тот или иной функционал в приложении
Добавьте новую роль у которой будет доступ ко всему. Соответственно, если вы авторизуетесь в административном приложении под пользователем с правами "админ" - будет выдаваться информация по API, под пользователем без прав - выдаст ошибку.
По идее не важно какое у вас приложение (публичное/непубличное), у вас вся логика должна быть реализована в API, а приложение будет лишь "отрисовывать" то, что прилетит от API.
Если проблема в чем-то другом – сформулируйте вопрос более четко