Сначала я опишу, как я настраиваю свои приложения, затем я опишу, как я использую API.
Настройка
- В моем Azure Активно Directory , у меня зарегистрировано два приложения: UI и Backend
- В UI есть идентификатор клиента clientId1, а в backend есть идентификатор клиента clientId2 (это GUID, но для простоты)
- Оба находятся под тот же арендатор tentant1 (один арендатор)
Backend (Web API)
- Backend имеет открытый API с областью действия «api: // clientId2 / access_as_user» и авторизованным клиентом "clientId1" с только что упомянутой областью действия
- Я использую
passport
и passport-azure-ad
(я скопировал https://github.com/Azure-Samples/active-directory-javascript-nodejs-webapi-v2). Моя конфигурация:
const config = {
identityMetadata: "https://login.microsoftonline.com/tenant1/v2.0/.well-known/openid-configuration",
clientID: "clientId2",
validateIssuer: false,
loggingLevel: 'info',
passReqToCallback: false,
loggingNoPII: false
};
- Я получаю это сообщение при запуске сервера:
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":16052,"level":40,"msg":"Production environments should always validate the issuer.","time":"2020-04-11T13:25:44.283Z","v":0}
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":16052,"level":30,"msg":"In BearerStrategy constructor: created strategy with options {\"identityMetadata\":\"https://login.microsoftonline.com/tenant1/v2.0/.well-known/openid-configuration\",\"clientID\":\"clientId2\",\"validateIssuer\":false,\"loggingLevel\":\"info\",\"passReqToCallback\":false,\"loggingNoPII\":false,\"clockSkew\":300,\"allowMultiAudiencesInToken\":false,\"audience\":[\"clientId2\",\"spn:clientId2\"]\"isB2C\":false,\"_isCommonEndpoint\":false}","time":"2020-04-11T13:25:44.285Z","v":0}
Listening on port 5000
Пользовательский интерфейс (Angular SPA)
- Пользовательский интерфейс имеет разрешения, которым автоматически предоставляется разрешение на доступ к Microsoft Graph (профиль, user.read, user.read.all - последний, который, я думаю, я предоставил). Права доступа указаны в разделе «Права доступа API»
- Я продолжил работу и также предоставил доступ к Backend access_as_user
- Для кода пользовательского интерфейса я использую библиотеку MSAL и снова скопировал репозиторий. (https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-angular)
- В поле
protectedResourceMap
я добавил следующее
['https://graph.microsoft.com/v1.0/me', ['user.read']],
['http://localhost:5000', ['api://clientId2/access_as_user']],
Я могу войти в систему и прочитать свой профиль пользователя, но при попытке доступа к
http://localhost: 5000 / hello (защищено) я получаю сообщение об ошибке в заголовке этого вопроса
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":20720,"level":30,"msg":"authentication failed due to: jwt audience is invalid","time":"2020-04-11T13:38:08.700Z","v":0}
-
Я вижу, что идет токен на предъявителя (в пользовательском интерфейсе и на сервере), сервер декодирует токен (я вижу все свои информация профиля в журналах сервера), но он говорит, что JWT недействителен ?!
Я не определяю аудиторию, но могу видеть в токене, когда она расшифровывается аудиторией с помощью aud: 'api://clientId2'
.
Я также вижу, когда запускается бэкэнд, она показывает аудиторию как [clientId2, sps:clientId2]
по умолчанию (шаг 4 на серверной части). Когда я определяю в конфигурации audience: 'api://clientId2'
, я получаю 403 с сообщением:
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":12644,"level":30,"msg":"In Strategy.prototype.jwtVerify: We did not pass Req back to Callback","time":"2020-04-11T16:19:30.398Z","v":0}
Любая помощь будет оценена. Спасибо.