3

node.js 用の Microsoft MSAL クイックスタートの修正版 (オリジナルはこちら) を使用して、暗黙的なフローを使用して Azure Storage API のアクセス トークンを正常に受け取りました。トークンにはグループ クレームが含まれていましたが、クレーム内の GUID の 1 つがテナント内のどのグループとも関連付けられていないようです。すべてのグループからユーザーを削除した後、クレームにはまだその GUID が含まれています (そして、予想どおり、他のユーザーはもう含まれていません)。

  "groups": [
    "2cb3a5e8-4606-4407-9a97-616246393b5d"
  ],

その GUID を Google で検索してもヒットしませんでした。そのため、何らかのよく知られた GUID ではないと推測しています。

グループ要求でこの "不明な" GUID を取得するのはなぜですか?

関連する AAD テナントは非常に小さなテナントであり、私が AAD と認証を学習するためにのみ使用しています。そのため、単一のグループのみが含まれます。関連するユーザーは、この単一のグループのメンバーではありません。

Azure Portal のユーザー ページを見てみましたが、ユーザーが「どのグループのメンバーでもない」ことを実際に示しています。Azure CLI は、ユーザーがどのグループのメンバーでもないことも示しています。

$ az ad user get-member-groups --upn jurjen@stupendous.org
[]
$

このテナントのグループの完全なリストには、単一のグループのみが含まれており、ご覧のとおり、その ObjectID は、クレームで取得した GUID と一致しません。

$ az ad group list --query [].objectId --output tsv
b1cc46de-8ce9-4395-9c7c-e4e90b3c0036
$

また、別のアプリケーション登録を作成し、ダミー API を公開しました。そのダミー API をスコープとして使用すると、再びアクセス トークンを正常に受信できますが、これには単一のグループ クレームと同じ不明な GUID が含まれています。

うまくいけば関連するコードのビットは次のとおりです。

前述のとおり、まず Azure Storage のアクセス トークンを取得しました。

        var requestObj = {
            scopes: ["https://storage.azure.com/user_impersonation"]
        };

...しかし、ダミーの API を使用してもまったく同じ結果が得られます。

        var requestObj = {
            scopes: ["api://7c7f72e9-d63e-44b6-badb-dd0e43df4cb1/user_impersonation"]
        };

このビットはユーザーをログインさせます:

        function signIn() {
            myMSALObj.loginPopup(requestObj).then(function (loginResponse) {
                //Successful login
                showWelcomeMessage();
                acquireTokenPopup();
            }).catch(function (error) {
                //Please check the console for errors
                console.log(error);
            });
        }

ここでトークンを取得します。callMSGraphトークンの範囲を考えると、ここでは機能しないことは承知しています。ブラウザー コンソール ログからトークンを取得し、jwt.ms を使用してデコードします。

        function acquireTokenPopup() {
            //Always start with acquireTokenSilent to obtain a token in the signed in user from cache
            myMSALObj.acquireTokenSilent(requestObj).then(function (tokenResponse) {
                console.log("Access Token from cache: " + JSON.stringify(tokenResponse.accessToken));
                callMSGraph(graphConfig.graphMeEndpoint, tokenResponse.accessToken, graphAPICallback);
            }).catch(function (error) {
                console.log(error);
                // Upon acquireTokenSilent failure (due to consent or interaction or login required ONLY)
                // Call acquireTokenPopup(popup window) 
                if (requiresInteraction(error.errorCode)) {
                    myMSALObj.acquireTokenPopup(requestObj).then(function (tokenResponse) {
                        console.log("Access Token after interaction: " + JSON.stringify(tokenResponse.accessToken));
                        callMSGraph(graphConfig.graphMeEndpoint, tokenResponse.accessToken, graphAPICallback);
                    }).catch(function (error) {
                        console.log(error);
                    });
                }
            });
        }
4

1 に答える 1