システムの処理のためのMicrosoft Graphの認証(Python)

2021/1/19

Microsoft365はGraphを使う事でユーザアプリケーションを作成したり処理の自動化をしたりすることができます。

今回は処理を自動化する目的のための認証についてです。このためにどの資料を読めばいいのかがわかれば概ねできたも同然だと思います。以下がそれです。

https://docs.microsoft.com/ja-jp/graph/auth-v2-service

このドキュメントの通りに進めます。やる事は書いてあるとおり、以下です。

  1. アプリを登録する。
  2. アプリで Microsoft Graph のアクセス許可を構成する。
  3. 管理者の同意を取得する。
  4. アクセス トークンを取得する。
  5. アクセス トークンを使用して、Microsoft Graph を呼び出す。

アプリの登録はazureポータルで行います。前提としてはmicrosoft 365にサインアップしている事です。

https://portal.azure.com/#home

ポータル画面を開いたらApp registrationsを選択します。

New registrationsを選択します。

 

NameとSupported account typesの項目を入力してregisterを押します。Redirect URIはWEBアプリを作る時などに使います。今回は不要です。

 

Appが登録された画面に表示されているaplication(client)IDをコピーしておきます。あとで使います。

左ペインにあるCertificates&secretsを開き、Client secretsにあるNew Client Secretsボタンを押します。

出力されたポップアップはそのままaddボタンを押します。

作成したシークレットのValueをコピーしておきます。後で使います。

左ペインのAPI Permitionsを開きます。ここで必要な権限を追加する必要がありますが、何をしたいかによって変わります。今回はuser.read.allの操作権限を追加します。Add permitionsを押します。

 

追加するPermitionsを検索する画面が開くので、Microsoft Graphを選択します。

今回はシステム用なのでApplication Permissionsを選択します。

検索ボックスにuser.read.allを入力すると候補が表示されますので、チェックを入れてAdd Permitionsを押します。追加したい権限が複数ある場合はまとめてAddできます。

ここ大事。登録された画面にあるGrant admin consent for テナント名というボタンを押してください。この操作は公式のガイドではAPIでの操作を推奨していますが、この画面でやったほうが簡単だと思います。

ポップアップはYesを押してください。

 

 

次にこのAppをPythonで作ります。url(url)をpostしてアクセストークン(r)を入手し、それを使ってユーザリストを取得するgetをして結果(response)を得て、それを表示します。

コードは一番下に貼っておきますのでテストするのであれば使ってください。client_idclient_secretは先の手順でコピーしておいた値に差し替えます。また、mikunet.clubは私のドメインなので、自分の環境の名前に差し替えてください。それはAzureポータルのBrandingペインにあるPublisher domainで確認できます。

 

PowerShell上で実行してみます。

ユーザ一情報を取得できました。

以上です。冒頭に記載した手順をどこで実施していたかわかったでしょうか。

  1. アプリを登録する。=>Portal画面で実施(最初の所)
  2. アプリで Microsoft Graph のアクセス許可を構成する。=>Portal画面で実施(user.read.allを付与した所)
  3. 管理者の同意を取得する。=>Portal画面で実施(Consentのボタン押す所)
  4. アクセス トークンを取得する。=>Python(POSTの所)
  5. アクセス トークンを使用して、Microsoft Graph を呼び出す。=>Python(GETの所)

あとは必要な権限を加えて煮るなり焼くなりやりたい放題ですね。

Microsoft Graph APIのリファレンスは以下にあります。

トークンは毎回取得しなくても1時間くらい使えます。コードは一応以下ですが、あくまでもテスト用です。

import sys
import requests
import json
import pprint
url = “https://login.microsoftonline.com/mikunet.club/oauth2/v2.0/token”
payload = {“client_id”: “8aeec6a8-1c1b-4c6f-a0e0-da92c278a3cf”,
    “scope”: “https://graph.microsoft.com/.default”,
    “client_secret”: “EnieWkm6AQY~4Z20Q5LyAs8~r.DY.xp7K6”,
    “grant_type”: “client_credentials”
}
headers = {“Content-Type”: “application/x-www-form-urlencoded”}
r=requests.post(url, data=payload, headers=headers)
jsonData = r.json()
#print(jsonData[“access_token”])
nr = “Bearer ” + jsonData[“access_token”]
response = requests.get(
    ‘https://graph.microsoft.com/v1.0/users’,
    headers={‘Authorization’:nr})
pprint.pprint(response.json())