selmertsxの素振り日記

ひたすら日々の素振り内容を書き続けるだけの日記

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

上記リクエストで必要なパラメータは、それぞれ下記のように設定します。

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