M365関連 技術

JavaScriptでMicrosoftGraphAPIを使う(Express&SDK版)

前回、ExpressとMSALを使用してGraphAPIを呼び出しましたが、今回はSDKを使用してGraphAPIを呼び出す方法となります

ExpressとMSALを使用したバージョンのブログ

関連記事
JavaScriptでMicrosoftGraphAPIを使う(Express&MSAL版) - ナストンのまとめ
JavaScriptでMicrosoftGraphAPIを使う(Express&MSAL版) - ナストンのまとめ

GraphAPIをJavaScriptから呼び出そうとした際に色々と手間取ったので、そのメモです今回はNodeJSのEx ...

続きを読む

JavaScript(TypeScript)のSDKのGitHub

GitHub公式
GitHub - microsoftgraph/msgraph-sdk-javascript: Microsoft Graph client library for JavaScript
GitHub - microsoftgraph/msgraph-sdk-javascript: Microsoft Graph client library for JavaScript

Microsoft Graph client library for JavaScript. Contribute to ...

続きを読む

アプリの準備

ExpressとMSAL版で使用したものと同じアプリとシークレットキーを使用していきます

ExpressとMSAL版のアプリ登録手順(アプリを作成する、登録したアプリの設定)を参考にしてください

参考記事
JavaScriptでMicrosoftGraphAPIを使う(Express&MSAL版) - ナストンのまとめ
JavaScriptでMicrosoftGraphAPIを使う(Express&MSAL版) - ナストンのまとめ

GraphAPIをJavaScriptから呼び出そうとした際に色々と手間取ったので、そのメモです今回はNodeJSのEx ...

続きを読む

NodeJSのプロジェクトの設定

プロジェクトに必要なものをインストールする

任意のプロジェクトファイル配下で以下のコマンドを実行し、プロジェクトを作成します

npm init
npm install --save @azure/identity @microsoft/microsoft-graph-client isomorphic-fetch express

今回インストールしたモジュールは認証時に使用する【@azure/identity】とGraphAPIを呼び出すための【@microsoft/microsoft-graph-client】(MicrosoftGraphJavaScriptClientライブラリ)、前述のライブラリ内で使用されている【isomorphic-fetch】、RestAPI作成で使用する【Express】をインストールします。今回も必要最低限のものしかインストールしていないので、必要に応じて適宜追加でインストールしてください

認証に必要なデータを設定

appSettings.jsというファイルを作成し、そこに認証時に必要となる情報を記載します

// アプリに登録されているシークレットキー認証用
const settings = {
  'tenantId': '使用するAzureアプリ上から取得したテナントID',
  'clientId': '使用するAzureアプリ上から取得したクライアントID',
  'clientSecret': '使用するAzureアプリ上のクライアントシークレットキーの値',
};

graphHelper.jsというファイルを作成し、そこに認証とGraphAPIを呼び出す関数を作成します

// 認証情報の初期設定
function initializeGraphForAppOnlyAuth(settings) {
  // 各設定項目がNull判定
  if (!settings) {
    throw new Error('Settings cannot be undefined');
  }

  _settings = settings;

  if (!_settings) {
    throw new Error('Settings cannot be undefined');
  }

  if (!_clientSecretCredential) {
    _clientSecretCredential = new azure.ClientSecretCredential(
      _settings.tenantId,
      _settings.clientId,
      _settings.clientSecret
    );
  }

  if (!_appClient) {
    const authProvider = new authProviders.TokenCredentialAuthenticationProvider(
      _clientSecretCredential, {
      scopes: ['https://graph.microsoft.com/.default']
    });

    _appClient = graph.Client.initWithMiddleware({
      authProvider: authProvider
    });
  }

  console.log('initializeGraph Sucess!!');
}

GraphAPIを呼び出す

ユーザー一覧取得

実際にユーザー一覧取得のGraphAPIを呼び出してみます。graphHelper.jsに以下を追記します

// ユーザー一覧取得処理
async function getUsersAsync() {
  if (!_appClient) {
    throw new Error('Graph has not been initialized for app-only auth');
  }

  return _appClient?.api('/users')
    .select(['displayName', 'mail'])                                  // 取得項目名:表示名、id、メールアドレス
    .top(25)                                                          // 先頭25件取得
    .orderby('displayName')                                           // 表示名を基準にソート
    .get();
}

次に、実際にExpress側で呼び出し用ユーザー一覧取得APIを用意します。index.jsに以下を追加します

// ユーザー一覧取得APIURL
app.get("/getAllUser", (req, res, next) => {
  (async () => {
    const userPage = await graphHelper.getUsersAsync();
    const users = userPage.value;


    // 1回のリクエストで取得できる数が決まっているので、
    // 以下の値がNullでなければまだ情報が取得できる
    const moreAvailable = userPage['@odata.nextLink'] != undefined;
    console.log(`\nMore users available? ${moreAvailable}`);

    res.json({ responseData: users });

  })().catch(next);
});

Postmanを使用して検証します

ユーザー情報の取得に成功しました

対象ユーザーのイベント一覧取得

先ほどと同様にイベント一覧用にgraphHelper.jsに以下を追記します

// 対象のカレンダー情報一覧を取得
async function getCalendarViewAsync(targetId, startDay, endDay) {
  if (!_appClient) {
    throw new Error('Graph has not been initialized for app-only auth');
  }

  const start = `${startDay}T00:00:00`;                               // 取得開始日付と時間をくっつける
  const end = `${endDay}T23:59:59`;                                   // 取得終了日付と時間をくっつける

  return _appClient?.api(`/users/${targetId}/calendarView`)
    .header('Prefer', 'outlook.timezone="Tokyo Standard Time"')       // 時刻を東京に指定(何も指定しないとUTCとなる)
    .query({
      startDateTime: start,                                           // 取得開始期間
      endDateTime: end                                                // 取得終了期間
    })
    .select(['subject', 'start', 'end', 'organizer', 'attendees'])    // 取得項目名:会議名、開始時間、終了時間、主催者、出席者
    .top(25)                                                          // 先頭25件取得
    .get();
}

実際にExpress側で呼び出し用イベント一覧APIを用意します。index.jsに以下を追加します

// カレンダー情報一覧取得APIURL
app.get("/getCalendarView", (req, res, next) => {
  (async () => {
    // クエリから情報を取得
    var targetId = req.query.targetId;
    var startDay = req.query.startDay;
    var endDay = req.query.endDay;

    const calendarView = await graphHelper.getCalendarViewAsync(targetId, startDay, endDay);
    const calendars = calendarView.value;

    // 1回のリクエストで取得できる数が決まっているので、
    // 以下の値がNullでなければまだ情報が取得できる
    const moreAvailable = calendars['@odata.nextLink'] != undefined;
    console.log(`\nMore users available? ${moreAvailable}`);

    res.json({ responseData: calendars });

  })().catch(next);
});

こちらもPostmanを使用して検証します

こちらも問題なく情報の取得ができました

最後に

GraphAPIを呼び出す際に使用される代表的なMSALとSDKを使用したものを記事にしました。個人的にはSDKの方が使い勝手が良かった印象を持ちました。今回使用したNodeJSのプロジェクトファイルやJSファイルを以下のGitHubにアップしているので、参考にしてください

サンプル
BlogSampleCodeProjects/MicrosoftGraphAPI_NodeJS_Express_SDK at main · nasuton/BlogSampleCodeProjects · GitHub
BlogSampleCodeProjects/MicrosoftGraphAPI_NodeJS_Express_SDK at main · nasuton/BlogSampleCodeProjects · GitHub

Project for sample code used in the blog.(Blogで記載しているサンプルコード ...

続きを読む

-M365関連, 技術
-, ,