Защита клиента OIuth clientId/clientSecret в приложении AngularJS

Я знаю, что это, вероятно, вековой вопрос, но... есть ли какие-либо рекомендации по защите секретов клиентов для выполнения аутентификации OAuth2 в приложениях AngularJS? Я пытаюсь думать о решении обеспечить действительно безопасный доступ к API из современных веб-приложений (они не обязательно должны быть AngularJS.) По моему опыту, добавление слоев абстракции и обфускации действительно не делает что-то для улучшения безопасности... они просто затрудняют взломать яйцо безопасности для любых предполагаемых хакеров (однако многие из них предпочитают хороший вызов, поэтому все, что вы действительно делаете, просто делает взломать больше удовольствия.)

Помимо очевидных неэффективных решений, таких как обфускация и свертка кода и тому подобное, существуют ли какие-либо рекомендации по защите секретов клиентов в современных веб-приложениях? Я знаю, что эти вопросы возникли с настольными клиентскими приложениями, и я не верю, что когда-либо было решение, выходящее за рамки "Могу также запутаться, что замедлит хакеров". Мы находимся в одной лодке с веб-приложениями? Нет ли реального решения этой проблемы?

Если нет решения... есть ли даже какая-то точка в обеспечении REST API с помощью OAuth?

Ответ 1

Помните, что OAuth меньше защищает от олицетворения и больше о защите учетных данных. Третьи стороны аутентифицировали идентификатор пользователя для вас, не выставляя учетные данные пользователя. Поскольку токены не являются учетными данными, количество вреда, которое может причинить хакер, и его окно действовать ограничено.

Но OAuth не является более безопасным для вашего приложения, чем обычная аутентификация имени пользователя /pwd. И в клиентских приложениях весь ваш код доступен для всего мира! В виде вы упомянули, что шифрование на стороне клиента является сомнительной стратегией.


Пока не установлены лучшие методы защиты взаимодействия с клиентом, вот несколько подходов к минимизации вашего воздействия:

1) SSL: Серебряная пуля? Может быть. Чем больше вы можете использовать SSL на своем сайте и ваших запросах, тем более безопасными будут запросы ваших пользователей. Я честно считаю, что все привилегированные запросы должны выполняться зашифрованными запросами.

2) Short Token Life-Span: Чем короче срок службы вашего токена, тем меньше стимулов/преимуществ его обнюхивания.

OAuth 2.0 создает постоянную болтовню аутентификации путем обмена токенами аутентификации для обновления токенов для токенов аутентификации. Вы, как разработчик, теперь разрабатываете чат-приложение, которое делает много "то, что ваш токен, вот еще один токен, попросите меня ввести токен, вот ваш новый токен... так что вы хотите?"... "oops, time up, где ваш токен обновления?"

Если это звучит как боль, это своего рода. OAuth 2.0 предназначен для упрощения процесса для разработчика. Но важно то, что чем короче срок службы ваших жетонов, тем труднее для хакера поддерживать мошенническую идентичность. Обновить ссылку на токен

3) Соберите свой домен: Хотите дать снифферам меньше шансов злоупотреблять щели в ваших доспехах? Не разрешайте запросы на кросс-домен!

Конечно, мы часто имеем распределенные среды. Но если ваш фасад находится в домене клиента, ваше воздействие уменьшается (выбор слов сомнительный).

Заставьте хакера использовать ваш домен, ограничьте его творчество.

4) Используйте сторонний API для поддержки вашего доступа как можно чаще: Google и Facebook API и службы были протестированы, битва протестирована и развилась. Чем больше вы можете опираться на них, чтобы поддерживать свою идентификацию пользователя, тем меньше вы будете делать, и меньше шансов принять.

5) Проверьте IP-адреса: Почти все может быть подделано, но хакер должен знать, что IP-адрес является частью вашей проверки. Это наименее обеспечено всеми практиками, но в сочетании с 1,2 или более пробелами для использования хакерами становятся меньше, а выигрыши для усилий исчезают.

6) Используйте "Секретный" или второй параметр:. Вы можете передавать своим пользователям больше, чем токены. Вы можете передать свой собственный Alter-Token.

Представьте, что данные ID передаются взад и вперед. Назовите параметр неочевидным образом. Сделайте это числом (например, возраст, высота, адрес). Важным моментом является то, что ваш хакер мало или совсем не знает, о чем попросят на другой стороне!

Вы можете бросить серьезный ключ обезьяны, имея 3 параметра, которые действуют как безопасность.

7) Не сообщайте сообщения об ошибках, чтобы сообщить хакеру, что они были пойманы. Дайте тайм-ауты msgs, а не "Got You!". Если захватчики не понимают, что мошенничество было пойманным, они также не адаптируются.


Я не могу сказать этого достаточно - SSL сохраняет много неприятностей.

Примечание.. Все поставщики-клиенты, которые я видел, разрешают доступ к их API без предоставления Secret. Секрет никогда не должен подвергаться воздействию на клиента.

  • Любые данные, выставленные на клиенте, могут быть сверкнуты
  • Любой алгоритм шифрования, который вы используете, будет отображаться на клиенте.

Ответ 2

Я пришел сюда, чтобы найти ответ на этот вопрос - как справиться с секретным /id в SPA. Я придумал свое собственное решение, которое скрывает секрет на сервере, но я хотел подтвердить, что я делаю, это лучшая практика. Поэтому, так как ответы избегают этого, я объясню свой поток в надежде, что он поможет любому.

Наша архитектура - у нас есть рубиновый сервер как сервер api и экспресс-сервер, обслуживающий приложение Angular.

Обычно все сообщения просто выполняются RESTfully через api, поэтому сервер node просто обслуживает статические файлы и не делает много всего.

Поскольку мы были в состоянии реализовать потоки входа/регистрации, я столкнулся с тем, что было для меня новичком - поток OAuth 2.0, как обрабатывать вещи.

Прежде чем мы сможем сделать какие-либо запросы на сервер, и сервер серьезно относится к нам, мы должны получить токен носителя. Я решил реализовать его как конечную точку node, чтобы скрыть секрет клиента внутри самого сервера node.

Таким образом, наш клиент вошел во все свои сочные данные и стал красноречивым, чтобы стать пользователем в нашем приложении, и нажал кнопку отправки.

  • Приложение запускает запрос на сервер node, чтобы получить себе яркий токен, который мы можем использовать в качестве Носителя. Я решил передать идентификатор клиента как параметр запроса запроса GET. Во-первых, у меня были оба идентификатора клиента и секрет на сервере node, но он чувствовал, что идентификатор может/должен быть на клиенте, ну, и. Поэтому я пошел таким образом.

  • Сервер node получает идентификатор клиента через запрос GET, а затем переходит к отправке POST на хост (ruby api). Построение типа url + grant + клиент id + секрет клиента. Таким образом, скрытие реализации от мира.

  • Сервер ruby ​​возвращает токен для использования, который мы затем возвращаем клиенту, который инициализировал запрос регистрации.

  • Теперь у SPA есть маркер Bearer, который мы можем использовать в заголовке запроса регистрации.

Таким образом, завершение нашего потока и скрытая тайна от мира.

Поскольку у нас есть токен с определенной продолжительностью жизни, у нас также есть перехватчик ошибок запроса, который будет ловить токены, срок действия которых истек, и, таким образом, сделать новый запрос на токен, а затем восстановить неудачный вызов.

Я решил использовать на стороне Angular вещи, которые этот поток для пользователей протекает.

https://github.com/sahat/satellizer

Его супер-удобный lib, который получает весь скучный шаблонный код, который должен быть написан каждый раз, когда мы хотим, чтобы приложение имело аутентификацию через электронную почту/пароль, а также через oauth.... очень удобно.

Итак, поскольку это моя собственная интерпретация того, как делать такие вещи - обратная связь просим.