从passport-azure-ad.OIDCStrategy获取access_token以用作承载令牌

时间:2016-10-28 15:19:07

标签: node.js azure adal azure-ad-graph-api passport-azure-ad

**免责声明 - 我是oAuth和OpenIDConnect的新手 - 如果我在这里问一个愚蠢的问题,请耐心等待。

我想创建一个从API请求数据的SPA。 SPA和API都托管在同一个nodejs服务器上。我希望任何访问数据和/或应用程序的人都可以通过Office365上的AzureAD租户进行身份验证。

目前,我使用passport-azure-ad.OIDCStrategy进行身份验证。但是,在我的应用程序中,我还希望能够从服务器端api代码中的Microsoft GRAPH api访问信息。但是,我已经建立的OIDC连接似乎不足以让我访问GRAPH api。似乎我可能需要一个jwt持票人令牌。

我的问题是,我是否需要使用OIDC响应中的访问令牌来获取承载令牌?如果是这样,我该怎么做(在服务器端 - nodejs)?

我尝试查看passport-auth-ad中列出的BearerStrategy v2端点示例。令我困惑的是它使用OIDCStrategy!这也会返回持票人令牌吗?如果是这样,我在第一次OIDCStrategy电话会议中是否已经收到了我需要的所有内容?

感谢您提供的任何帮助!

更新

void test() {
  my_machine p;
  p.start();
  // Must have at least 1 triggering external event to not overflow the stack
  while (true) {
    p.process_event(event1());
  }
}

错误消息:

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();

我确认该令牌与Azure中auth回调中作为id_token传递的令牌相同。有什么想法吗?

更新2

更多代码片段,以帮助诊断我可能出错的地方。

策略配置

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

路线定义

//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 });
}));

1 个答案:

答案 0 :(得分:0)

OpenIDConnect工作大流程也会返回一个JWT令牌,用于Authentication&授权。您可以在身份验证标头中使用id_token作为资源。但是,Graph API中的某些操作需要管理员权限。

您可以尝试在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