Azure ADのGraphAPIを利用する
この資料を読んでできるようになること
手順
- Appを登録する
- AccessTokenを取得する
- GraphAPIを叩く
Appを登録する
- Azure Active Directoryを選択
- App Registrationsを選択
- nameとsign-on URLを設定
- このとき sign-on URLは適当なものでも良い
- createボタンを押す
- APIが作成されて画面が変化する
- API AccessカテゴリのRequired Permissionsを選択
- Microsoft Graphの中から必要なものを選択
- Grant permissionsを実行する
- ふたたび API Access カテゴリの中からKeysを選択
- 適当にpasswordのdescriptionsを記入し保存すると、secret_keyが表示されるのでメモっておく
- Application IDもメモっておく
AccessTokenを取得する
https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_v2_service#4-get-an-access-token
Graph APIを実行する際に必要なAccess Tokenの取得方法について、上記のドキュメントに記載されています。それによると、Access Tokenを取得するために必要なパラメータはclient_id、scope、client_secret, grant_typeの4つです。
// Line breaks are for legibility only.
POST /{tenant_id}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials
上記リクエストで必要なパラメータは、それぞれ下記のように設定します。
- client_id: Application ID
- client_secrets: Applicationを登録した際の鍵の値
- scope: "https://graph.microsoft.com/.default"
- grant_type: "client_credentials"
実際にAccessTokenを取得するためのコードは下記のようになります。
import * as request from "request"; const OauthTokenEndpoint = process.env.OAUTH_TOKEN_ENDPOINT; const AppID = process.env.APP_ID; const AppKEY = process.env.APP_KEY; export function getAccessToken(): Promise<string> { const requestParams = { grant_type: "client_credentials", client_id: AppID, client_secret: AppKEY, scope: "https://graph.microsoft.com/.default" }; return new Promise((resolve, reject) => { request.post({ url: OauthTokenEndpoint, form: requestParams }, function(err, _response, body) { var parsedBody = JSON.parse(body); if (err) reject(err); if (parsedBody.error_description) reject(parsedBody.error_description); resolve(parsedBody.access_token); }); }); }
このとき、OAUTH_TOKEN_ENDPOINTはhttps://login.microsoftonline.com/${tenant_id}/oauth2/v2.0/tokenのような値になります。
GraphAPIを叩く
Azure ADにおいてディレクトリ内のデータに対して操作をするには Graph APIを利用する必要があります。今回はAzure AD上にGroupを作ってみることにしました。 https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/group_post_groups
このAPIを実行するために、microsoftがpackageを提供しているので利用してみても良いでしょう。 https://github.com/microsoftgraph/msgraph-typescript-typings
実装
import * as auth from "./auth"; import { AzureClient } from "./AzureClient"; async function handler(): Promise<void> { const token: string = await auth.getAccessToken(); const client: AzureClient = new AzureClient(token); const res = await client.createGroup(); console.log(res); } handler();
import { Client } from "@microsoft/microsoft-graph-client"; export class AzureClient { client: Client; constructor(token: string) { this.client = Client.init({ authProvider: done => { done(null, token); } }); } public createGroup() { const requestParams = { displayName: "sample Display Name", mailEnabled: false, mailNickname: "SAMPLE", securityEnabled: true }; return this.client.api("/groups").post(requestParams); } }
レスポンス
{
'@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#groups/$entity',
id: 'xxxx',
deletedDateTime: null,
classification: null,
createdDateTime: '2018-09-21T04:21:05Z',
creationOptions: [],
description: null,
displayName: 'sample Display Name',
groupTypes: [],
mail: null,
mailEnabled: false,
mailNickname: 'idaas',
onPremisesLastSyncDateTime: null,
onPremisesSecurityIdentifier: null,
onPremisesSyncEnabled: null,
preferredDataLocation: null,
proxyAddresses: [],
renewedDateTime: '2018-09-21T04:21:05Z',
resourceBehaviorOptions: [],
resourceProvisioningOptions: [],
securityEnabled: true,
visibility: null,
onPremisesProvisioningErrors: []
}
ということで無事groupを作成することができました。