Как защитить идентификатор клиента в OAuth2?

#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 . В любом случае вам нужен серверный сервер, либо узел, либо что-то еще. Вы не можете уйти от того факта, что вам нужны идентификатор и секрет, чтобы иметь возможность получить токен. Если вы можете найти способ надежно хранить их на стороне интерфейса, то вы решили проблему.