2

** 免責事項 -- 私は oAuth と OpenIDConnect の世界に不慣れです -- ここでばかげた質問をしている場合は、しばらくお待ちください。

API からデータを要求する SPA を作成したいと考えています。SPA と API はどちらも同じ nodejs サーバーでホストされています。データやアプリにアクセスするすべての人が、Office365 の AzureAD テナントで認証されるようにしたいと考えています。

現在、passport-azure-ad.OIDCStrategy を使用して認証部分が機能しています。ただし、私のアプリでは、サーバー側の API コードで Microsoft GRAPH API からの情報にもアクセスできるようにしたいと考えています。しかし、既に作成した OIDC 接続では、GRAPH API にアクセスするには十分ではないようです。おそらく、jwt ベアラー トークンが必要なようです。

私の質問は、OIDC 応答からのアクセス トークンを使用してベアラー トークンを取得する必要があるかどうかです。もしそうなら、どうすればいいですか(サーバー側 - nodejs)?

BearerStrategy v2 エンドポイントについて、passport-auth-ad に記載されている例を表示してみました。しかし、私を混乱させているのは、それが 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.", ...

トークンは、Azure からの認証コールバックで id_token として渡されたものと同じトークンであることを確認しました。何かご意見は?

更新 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")})
4

1 に答える 1