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を作成することができました。