ユーザー認証を含み、ユーザー認証なしを含む、Microsoft IdentityPlatformを介してアクセストークンを取得します。
序文
最初に、ユーザーはMicrosoftのhttps://login.microsoftonline.comに電話して、ログイン認証を完了するためにMicrosoftアカウントのパスワードを入力するように求められました。認証後、ユーザーは操作を続行するためにWebページにリダイレクトされました。後で、顧客は、誰もが自分のMicrosoftアカウントを覚えているわけではないと言いました。パスワードを自動ログインに変更してから、完全にユーザーフリーの認証に変更する必要があります。これにより、グループ内のすべてのメンバーの情報を取得できますが、顧客は権限が大きすぎて情報へのアクセスが多すぎると判断したため、次のように変更します。ユーザー認証を通過するには、認証されたユーザーがグループ管理者であるだけで、他のメンバーのOutlookイベントを操作します。グループ。
したがって、要約すると、今回は次の3つの認証方法が実装されました。
- Microsoft IDプラットフォームを介して、ユーザーがアカウントログインを完了すると、アクセストークンを取得し、リダイレクトします。
- クライアントシークレット値を使用して、ユーザーなしでID認証を完了します。
- ユーザーの手動ログインなしで代表ユーザーアカウントを使用し、ID認証を自動的に完了します。
1. Microsoft IDプラットフォームを介して、ユーザーがアカウントログインを完了すると、アクセストークンを取得し、リダイレクトします。
これは、ユーザーが認証を完了するためにアカウントパスワードを手動で入力する必要がある状況の例を紹介する公式のangularDemoです。githubからコードをダウンロードし、簡単な構成(npm install)の後、実行結果は次のようになります。
上の写真は、ユーザーがMicrosoftアカウントのパスワードを手動で入力してID認証を行うためのものです。認証が完了すると、次の写真が表示されます。
上図に示すように、認証は成功します。
ここでのキー認証処理コードは次のとおりです
1つは、「@ azure / msal-angular」からimport {MsalService}を導入してloginPopupメソッドを呼び出し、OAuthSettingsを渡して認証を実現することです。
async signIn(): Promise<void> {
let result = await this.msalService.loginPopup(OAuthSettings)
.catch((reason) => {
this.alertsService.addError('Login failed', JSON.stringify(reason, null, 2));
});
if (result) {
this.authenticated = true;
this.user = await this.getUser();
}
}
// access Token 获取
async getAccessToken(): Promise<string> {
let result = await this.msalService.acquireTokenSilent(OAuthSettings)
.catch((reason) => {
this.alertsService.addError('Get token failed', JSON.stringify(reason, null, 2));
});
if (result) {
return result.accessToken;
}
// Couldn't get a token
this.authenticated = false;
return null;
}
これは、accessToken Registration import *をMicrosoftGraphとして「@microsoft / microsoft-graph-types」;サービスから取得し、Microsoft GraphAPIを呼び出して情報を取得することです。
this.graphClient = Client.init({
authProvider: async (done) => {
// Get the token from the auth service
let token = await this.authService.getAccessToken()
.catch((reason) => {
done(reason, null);
});
if (token)
{
done(null, token);
} else {
done("Could not get an access token", null);
}
}
});
公式のNodeJsデモを使用する前に、example.env構成情報とnpminstallを変更する必要があります。キーコードは次のとおりです。
次に、クライアントシークレット値を使用して、ユーザーなしでID認証を完了します。
ユーザー認証を行わないための鍵は、前の記事で説明した秘密の値であるCLIENT_SECRETを使用することです。
さらに、Microsoft Azureによって登録されたAPIアクセス許可は、アプリケーションアクセス許可に関連するアクセス許可とともに追加する必要があります 。
最初のステップは、accessTokenを取得することです。ここで、axiosモジュールは、nodeJSのキーコードであるhttpリクエストを開始するために使用されます。
import axios from 'axios';
const querystring: any = require('querystring');
const TENANT_ID = 'xxxx'
const CLIENT_ID = 'xxxx';
const CLIENT_SECRET = 'xxxx';
(async () => {
const qs = querystring.stringify({
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
scope: 'https://graph.microsoft.com/.default',
grant_type: 'client_credentials'
});
const url = `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token`;
const result = await axios.request({
url,
method: "POST",
data: qs
});
const access_token = result.data.access_token;
console.log(access_token);
})();
@ microsoft / microsoft-graph-clientを使用せずに、アクセストークンを介してMicrosoft GraphAPIを呼び出します
import axios from 'axios';
const ACCESS_TOKEN = 'xxxx';
(async () => {
const itemList = [];
const url = 'https://graph.microsoft.com/v1.0/groups';
let page = url;
do {
const result = await axios.request({
headers: {
'Authorization': `Bearer ${ACCESS_TOKEN}`
},
url: page,
method: "GET"
});
itemList.push(...result.data.value);
page = result.data["@odata.nextLink"];
} while (page);
console.log(itemList);
})();
@ microsoft / microsoft-graph-clientを使用する場合は、アクセストークンを介してMicrosoft GraphAPIを呼び出します。
var graph = require('@microsoft/microsoft-graph-client');
// graph.Client注册
function getAuthenticatedClient(accessToken) {
// Initialize Graph client
const client = graph.Client.init({
// Use the provided access token to authenticate
// requests
authProvider: (done) => {
done(null, accessToken);
}
});
return client;
}
module.exports = {
getUserDetails: async function(accessToken,userPrincipalName) {
const client = getAuthenticatedClient(accessToken);
//const user = await client.api('/me')
const user = await client.api(`/users/${userPrincipalName}`)
.select('displayName,givenName,jobTitle,mail,mobilePhone,officeLocation,preferredLanguage,surname,userPrincipalName,id,mailboxSettings')
.get();
return user;
},
};
3.代表ユーザーアカウントを使用して、ID認証を自動的に完了します。
以前のユーザー認証なしと比較して、変更されたコードが次のとおりである限り
import axios from 'axios';
const querystring: any = require('querystring');
const TENANT_ID = 'xxxx'
const CLIENT_ID = 'xxxx';
//const CLIENT_SECRET = 'xxxx';
const USER_ID = 'xxxx';
const USER_PASSWORD = 'xxxx';
(async () => {
const qs = querystring.stringify({
client_id: CLIENT_ID,
username:USER_ID ,
password:USER_PASSWORD,
grant_type: 'password'
});
const url = `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token`;
const result = await axios.request({
url,
method: "POST",
data: qs
});
const access_token = result.data.access_token;
console.log(access_token);
})();
上記は3つの認証方法です。取得したアクセストークンのJWT分析により、返された情報を表示できます。たとえば、ユーザー認証なしで取得したアクセストークンは、次のように分析されます。ユーザーが取得したアクセストークンは、次のようにわずかに異なります。下の2番目の図に示されています。
ユーザー認証なしのアクセストークン
ユーザー認証付きのアクセストークン