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