#angularjs #authentication #angular #oauth2 #identityserver4
#angularjs #аутентификация #angular #oauth-2.0 #identityserver4
Вопрос:
Мы хотим разработать приложение Angular 2 с внешним сервером OAuth2 (IdentityServer4).
Мы также хотим идентифицировать каждого клиента на предмет уникальности. Но как защитить идентификатор клиента в исходном коде Angular 2 / Javascript? Обязательно ли нам работать здесь с CORS и проверять происхождение запроса? Обязательно ли создавать серверное приложение для аутентификации?
Наше мобильное приложение должно использовать идентификатор клиента 12345, Наше приложение Angular должно использовать идентификатор клиента 99999
Но если кто-то другой попытается использовать идентификатор клиента 12345, он должен быть отклонен.
Какова наилучшая практика здесь? — Аутентифицироваться напрямую с помощью Angular? — Использовать для каждого приложения angular серверное приложение для авторизации?
Ответ №1:
Вы не можете аутентифицировать общедоступных клиентов — для этого нет безопасного способа.
Особенно для клиентов на основе браузера, вы можете использовать только право собственности на общедоступный URL возврата для идентификации клиента.
Это никогда не было возможно — и OAuth2 не меняет эту ситуацию.
Ответ №2:
OAuth2 работает с парой важных ключей.
Для идентификации одного приложения используются как идентификатор клиента, так и clientSecret. Идентификатор клиента может быть общедоступным, это секрет, который должен оставаться, ну, в общем, секретным :).
Поскольку ваш код будет на стороне клиента, это создает проблему. Я почти уверен, что существует реализация OAuth2, которая работает только на стороне клиента. Честно говоря, я не уверен в его безопасности, поскольку все, что вы делаете на стороне клиента, видно, что бы вы ни делали.
Что я делал в подобных ситуациях, так это создавал небольшой серверный интерфейс, который был дополнительным слоем между клиентским приложением и сервером OAuth2. Это может быть очень простой MVC или очень простой WebApi2, и в нем будут представлены только конечные точки, которые будут использоваться внешним интерфейсом, но его основной обязанностью будет принимать вызов от внешнего интерфейса, добавлять ключи и создавать вызовы OAuth2 для использования фактическим сервером ресурсов. Таким образом, ваши ключи никогда не хранятся во внешнем интерфейсе, и вы можете использовать любой механизм, который вы хотите, чтобы сохранить их в безопасности на внутренней стороне.
Просто сделайте так, чтобы вы всегда передавали эти данные в заголовке аутентификации, и вы всегда будете работать с сервером аутентификации / ресурсов через https соединение.
Комментарии:
1. Итак, наилучший способ скрыть секрет клиента — всегда отправлять Angular с серверным приложением, таким как ASP.NET Ядро, которое управляет аутентификацией? Я могу не только запускать Angular на CDN и взаимодействовать с сервером OAuth 2 и защищать данные? Это… не является подавляющим.
2. есть пакет node, который вы можете изучить с помощью: npmjs.com/package/node-oauth2-server . В любом случае вам нужен серверный сервер, либо узел, либо что-то еще. Вы не можете уйти от того факта, что вам нужны идентификатор и секрет, чтобы иметь возможность получить токен. Если вы можете найти способ надежно хранить их на стороне интерфейса, то вы решили проблему.