Получите access_token от passport-azure-ad.OIDCStrategy для использования в качестве токена-носителя

** Отказ от ответственности - я новичок в мире oAuth и OpenIDConnect - пожалуйста, будьте терпеливы, если я задаю глупый вопрос здесь.

Я хочу создать SPA, который будет запрашивать данные у API. И SPA, и API размещены на одном сервере nodejs. Я хочу, чтобы любой пользователь, имеющий доступ к данным и / или приложению, проходил аутентификацию с нашим клиентом AzureAD в Office365.

В настоящее время у меня есть часть аутентификации, работающая с использованием passport-azure-ad.OIDCStrategy. Тем не менее, в моем приложении я также хотел бы иметь возможность доступа к информации из API Microsoft GRAPH в коде API на стороне сервера. Однако соединения OIDC, которое я уже установил, похоже, недостаточно для того, чтобы я мог получить доступ к API GRAPH. Похоже, мне может понадобиться токен на предъявителя jwt.

У меня вопрос, нужно ли мне использовать токен доступа из ответа OIDC, чтобы получить токен канала-носителя? Если да, то как мне это сделать (на стороне сервера - nodejs)?

Я попытался просмотреть пример, указанный в passport-auth-ad для конечной точки BearerStrategy v2. Что меня смущает, так это то, что он использует OIDCStrategy! Это также возвращает токен на предъявителя? Если да, получаю ли я все, что мне нужно, в моем первом вызове OIDCStrategy?

Спасибо за любую помощь, которую вы можете предложить!

Обновить

https.request({
        hostname: "graph.microsoft.com",
        path: '/v1.0/me/messages',
        port: 443, 
        method: 'GET',
        headers: {Authorization: 'Bearer ' + req.user.token, Accept: "application/json"}
    },(rs) => {
        console.log("HTTPS Response Status: ", rs.statusCode);
        console.log("HTTPS Response Headers: ", rs.headers)
        rs.on('data', (d) => {
            res.send(d)
        })
    }).end();

Сообщение об ошибке:

{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure.", ...

Я подтвердил, что токен - это тот же токен, который был передан как id_token в обратном вызове аутентификации из Azure. Какие-нибудь мысли?

Обновление 2

Еще несколько фрагментов кода, чтобы помочь в диагностике, где я могу пойти не так.

Стратегия Конфиг

//Still test code so user management not fully implemented
passport.use("azure", new azureStrategy({
    identityMetadata: 'https://login.microsoftonline.com/common/.well-known/openid-configuration',
    clientID: "*********************",
    responseType: 'code id_token',
    issuer: "https://sts.windows.net/****************/",
    responseMode: 'form_post',
    redirectUrl: "https://localhost:5070/auth/azure/callback",
    allowHttpForRedirectUrl: true,
    clientSecret: "***************" ,
    state: "************"
},
(iss, sub, profile, claims, accessToken, refreshToken, params, done) => {
    process.nextTick(() => {
        var user = usvc.findUserByAltId(profile.oid, "azure");
        if(!user){

        }
    })
    done(null, {id: profile.oid, name: profile.displayName, email: profile.upn, photoURL: "", token: params.id_token });
}));

Определения маршрутов

app.get("/auth/azure", azure.passport.authenticate(
 'azure', {scope: ['Mail.Read','User.Read'], failureRedirect: '/'}))

app.post("/auth/azure/callback", azure.passport.authenticate(
  "azure", {scope: ['Mail.Read','User.Read'], failureRedirect: "/error.html"}),
(req, res) => {res.redirect("/user")})

1 ответ

Большой поток работ OpenIDConnect также вернет токен JWT для аутентификации и авторизации. Вы можете использовать id_token в заголовке аутентификации для ресурсов. Тем не менее, некоторые операции в API Graph требуют разрешения администратора.

Вы можете попробовать запустить следующий скрипт в PowerShell обновить привилегию приложения Azure AD.

Connect-MsolService
$ClientIdWebApp = '{your_AD_application_client_id}'
$webApp = Get-MsolServicePrincipal –AppPrincipalId $ClientIdWebApp
#use Add-MsolRoleMember to add it to "Company Administrator" role).
Add-MsolRoleMember -RoleName "Company Administrator" -RoleMemberType ServicePrincipal -RoleMemberObjectId $webApp.ObjectId 
Другие вопросы по тегам