passport-azure-ad: какую стратегию использовать

У нас есть интерфейс, разработанный в AngularJS, и API-интерфейсы бэкенда в NodeJ. Мы используем Azure AD для аутентификации. Frontend Angular использует библиотеку javascript adal-angular для аутентификации Azure. Поэтому, когда пользователь заходит на веб-сайт, он перенаправляется на https://login.microsoftonline.com/ и после успешной аутентификации он перенаправляется обратно на наш веб-сайт. Все идет нормально.
Я должен защищать API-интерфейсы сервера, используя библиотеку passport-azure-ad. Только внешний интерфейс вызывает эти API. Есть две стратегии, доступные с использованием этой библиотеки
1> Стратегия OAuth2Bearer
2> OIDCStrategy для Open ID Connect

У меня сложилось впечатление, что Azure AD по умолчанию использует OpenID Connect для аутентификации. Поэтому я планировал использовать OIDCStrategy для защиты веб-API Node, как обсуждалось здесь
Однако в Fiddler я вижу следующий запрос клиента (то есть угловой интерфейс), когда он вызывает веб-API

GET http://localhost:4030/api/getemployees HTTP/1.1  
Host: localhost:4030  
Connection: keep-alive  
Accept: application/json, text/plain, */*  
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36  
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOi………………………  
Referer: http://localhost:4030/  
Accept-Encoding: gzip, deflate, sdch  
Accept-Language: en-US,en;q=0.8  

Примечание. Тег авторизации начинается с "Bearer", поэтому я предполагаю, что клиент отправляет токен Bearer на сервер.

Q
1> какую стратегию я должен использовать здесь?
2> когда мы должны использовать один над другим?

1 ответ

Решение

Я утверждаю passport-azure-ad, Разница здесь между "авторизацией" и "аутентификацией".

OAuth2 используется для авторизации (есть ли у меня доступ к этому?).

OpenID Connect используется для аутентификации (это кто я).

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

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

В вашем сценарии вы используете Angular, который выполняет аутентификацию OpenID Connect для вас, поэтому ваши веб-API должны использовать стратегию Bearer.

Я написал пример, который проведет вас через все это здесь: https://azure.microsoft.com/en-us/documentation/articles/active-directory-devquickstarts-webapi-nodejs/ который использует стек MEAN, и который использует пример приложения для iOS, который я написал в качестве внешнего интерфейса. Играя с обоими из них, легко увидеть, как один действует как элемент аутентификации (приложение iOS), а другой сидит там и защищает API, действующий как элемент авторизации (приложение node.js).

Код для приложения node.js: https://github.com/Azure-Samples/active-directory-node-webapi

Код для приложения iOS: https://github.com/Azure-Samples/active-directory-ios

Более подробное описание этих тем можно найти здесь: https://azure.microsoft.com/en-us/documentation/articles/active-directory-authentication-scenarios/

Дайте мне знать, если у вас есть еще вопросы!

Другие вопросы по тегам