Graph によるMicrosoftクラウドからのアクセス

  • 目次:
    • はじめに
    • Microsoft Graph とは
    • 実装前の準備
    • 実装する方法
      1. 事前準備
      2. 権限チェック
      3. 環境構成
      4. アプリケーションの初期化
      5. Azure AD 認証コード取得
      6. 設定ファイルの書き方
      7. ログイン機能をつくる
    • ファイルの説明
    • まとめ

   

はじめに

現在では、多くの企業が Microsoft Office と協力し、クラウドにデータを保存しています。例えば、ファイルを保存することや、メッセージの送信や、資料を共有するなど、クラウドには読者ーが作成する大量のデータが格納されていて、組織内の作業に役に立ちます。この記事では、Microsoft Graph API について簡単に説明し、読者が Microsoft Office データベースから情報を取得する方法を紹介したいと思います。

Microsoft Graph とは

まず、公式 Web サイトによりますと「Microsoft Graph is the gateway to data and intelligence in Microsoft 365」と定義されています。Graph は、Microsoft 複数製品にアクセスできる統合プログラマブル モデルを提供します。 つまり、複数のサービスとデバイスを接続し、開発者が自社のサービスを Microsoft 製品と統合できるプラットフォームかあります。クラウドに保存されている大量のデータにクセスしたいときに、いままでは それぞれのアプリケーションから接続しないといけないですが、Microsoft Graphは新しい選択肢となります。

下記は Graphでクセス可能なMicrosoftクラウドサービスです:

  • Microsoft 365 サービス: Excel, Microsoft Teams, OneDrive, OneNote, Outlook, Planner, SharePoint
  • エンタープライズモビリティおよびセキュリティサービス: Advanced Threat Analytics, Advanced Threat Protection, Azure Active Directory, Identity Manager, and Intune
  • Windows 10 サービス: activities, devices, notifications, Universal Print
  • Dynamics 365 ビジネスセントラル

実装前の準備

このGraph API では、インターネットへのアクセスが必要でありますため、Web インターフェイスを構築する必要があります。

決定されるべき3つのポイントがあります。


1.言語またはプラットフォームの選択
  言語またはプラットフォーム
  ASP.NET / Node.js / PHP / Python / Ruby などなど…

 2.アプリケーション ID を取得します

 3.サンプルの作成

この投稿のサンプルでは、クラウドからデータを取得した後に、他のPython関数で処理します。また、Python(Django)は他のアプリケーションとの拡張性がいいのでpythonで紹介します。 次のセクションでは、Graph API と Django の実装方法を紹介します。

実装する方法

この実装の目的は、弊社のアプリケーションからMicrosoftクラウドプラットフォームへのログイン機能を実現することかあります。この機能が完了すると、Microsoftクラウドにアクセスし、読者が希望する他の機能を追加することができます。

上のセクションでは、なぜ Django で実装したのかについて説明しました。これからは Python て開発するために必要な環境準備を説明します。

事前準備

  1.開発マシンに Python(3.8)をダウンロードして、PIP機能をインストールします。

   2. Microsoft Office 365 へのアクセス権限を持つアカウント。

権限チェック

Graph Explorer Web アプリケーションにアカウントをログインします。チェックしたいAPIを3番目のブロックに入れて、実行をクリックします。今後はAPIを使用する前に先ずはこちらで権限を確認する必要があります。

権限エラーが発生する場合には、以下の手順で各機能の権限を確認してください。機能の権限時に管理者から許可を得る。

成功する場合には、JSONのデータとともに200が表示されます。

環境構成

Djangoをインストールします。jjjjj

pip install --user Django==3.1.4

Django プロジェクトを作成します。

django-admin startproject

Django プロジェクトのディレクトリに移動し、次のコマンドを入力してローカル Web サーバを起動します。

python manage.py runserver

ブラウザを開き、 http://localhost:8000 に移動します。ここまでうまくいけましたら、Django Welcome ページが表示されます。このプロジェクトの構成を完了するには、まだいくつかの手順があります。

Creating a landing page in Django | LaptrinhX

アプリケーションの初期化

  • データを受け取るためにアプリを準備します
  • Azure AD にアクセスできるように準備します
  • Microsoft アプリケーションに接続する機能を作ります

ライブラリのインストール

MSAL(Microsoft Authentication Library), これは、アカウントの権限と要求を処理するものあります。

pip install msal==1.7.0

Requests, これはMicrosoft Graphに通信する機能かあります。

pip install requests==2.25.0

PyYAML, これはYAML ファイルを設定する機能かあります。

pip install pyyaml==5.3.1

Python-dateutil, Microsoft Graphから返される ISO 8601 日付文字列を解析する機能かあります。

pip install python-dateutil==2.8.1

ここまで、Djangoの基本的な開発環境の設定が終りました。

Azure AD 認証コード取得

このパートの目的は、Microsoft データベースからデータにアクセスするために認証コード(app_idとapp_password)を取得します。 取得した認証コードをアプリケーションに設定すると、アクセスが許可されます。

上の手順を完了しましたら、ポータルにアプリケーションを登録する必要があります。 この手順では、Azure Active Directory 管理センターを使用して、 Azure AD アプリケーションに新規登録を作成します。 Azure が提供する認証コードを設定するだけで、Graphでデータにアクセスできます。

Azure Active Directory 管理センタ に移動します。 企業アカウントまたは学校アカウントを使用してログインします。

左側の表でAzure Active Directoryを選択し、“管理”の”新しい登録”を選択してください。

“新しい登録”を選択しますと、3 つの値を設定できます。

  • 名前
  • サポートされているアカウントの種類
  • リダイレクト URI (省略可能)

“登録”を選択し、アプリケーション ID の値を保存します。 次のステップで使用します。

“管理”で “証明書とシークレット”を選択します。 “新しいクライアント シークレット”を選択し、フォームに必要な項目を入力します。

クライアント シークレットの追加に記入します。

     説明 – このクライアントシークレットに対する説明を入力してください

     有效期限 — カスタムを選択します

これでAzure ADの設定が完了しました。クライアント シークレットから値を保存してください。 次のステップで使用します。

設定ファイルの書き方

設定ファイルに保存したAzure AD 認証コードを設定します。
./<project_name> の直下に oauth_settings.yml ファイルを作成して、先の手順でコピーしたコードを貼り付けます。

app_id: "YOUR_APP_ID_HERE"
app_secret: "YOUR_APP_PASSWORD_HERE"
redirect: "http://localhost:8000/callback"
scopes:
 - user.read
 - mailboxsettings.read
  - calendars.readwrite
  - mailboxsettings.read
  - calendars.readwrite
authority: https://login.microsoftonline.com/common

これらの設定に問題がなければ、次の手順に進んでサインイン機能を作成します。 ここの認証を設定したことによって他の機能が動けるため、非常に重要な部分です。

ログイン機能をつくる

この実装には、サインイン、コールバック、サインアウトの 3 つの機能があります。サインインとコールバックを一緒に作ります。完成した後に、サインアウトを作ります。

まず、 ./tutorial ディレクトリにauth_helper.py という名前の 新しいファイルを作成します。

auth_helperファイルでは、Azure AD へアクセスに必要な情報を設定します。 (他の Microsoft アプリケーションからAzureにアクセスする場合には、このファイルで設定します。)

import yaml
import msal
import os
import time

# Load the oauth_settings.yml file
stream = open('oauth_settings.yml', 'r')
settings = yaml.load(stream, yaml.SafeLoader)

def load_cache(request):
# Check for a token cache in the session
cache = msal.SerializableTokenCache()
if request.session.get('token_cache'):
cache.deserialize(request.session['token_cache'])

return cache

def save_cache(request, cache):
# If cache has changed, persist back to session
if cache.has_state_changed:
request.session['token_cache'] = cache.serialize()

def get_msal_app(cache=None):
# Initialize the MSAL confidential client
auth_app = msal.ConfidentialClientApplication(
settings['app_id'],
authority=settings['authority'],
client_credential=settings['app_secret'],
token_cache=cache)

return auth_app

# Method to generate a sign-in flow
def get_sign_in_flow():
auth_app = get_msal_app()

return auth_app.initiate_auth_code_flow(
settings['scopes'],
redirect_uri=settings['redirect'])

# Method to exchange auth code for access token
def get_token_from_code(request):
cache = load_cache(request)
auth_app = get_msal_app(cache)

# Get the flow saved in session
flow = request.session.pop('auth_flow', {})

result = auth_app.acquire_token_by_auth_code_flow(flow, request.GET)
save_cache(request, cache)

return result

get_msal_app : ライブラリの設定かあります。
get_sign_in_flow : 認可 URL を生成します
get_token_from_code:アクセス トークンで認証コードを交換します。

次に、この 2 つの機能をview.pyにインポートします。

from tutorial.auth_helper import get_sign_in_flow, get_token_from_code

./tutorial/views.pyにサインイン機能を追加します。

def sign_in(request):
# Get the sign-in flow
flow = get_sign_in_flow()
# Save the expected flow so we can use it in the callback
try:
request.session['auth_flow'] = flow
except Exception as e:
print(e)
# Redirect to the Azure sign-in page
return HttpResponseRedirect(flow['auth_uri'])

/tutorial/views.pyにコールバック機能を追加します。

def callback(request):
# Make the token request
result = get_token_from_code(request)
# Temporary! Save the response in an error so it's displayed
request.session['flash_error'] = { 'message': 'Token retrieved', 'debug': format(result) }
return HttpResponseRedirect(reverse('home'))

また、url.py ファイルにパスを追記することを忘れないでください。

path('signin', views.sign_in, name='signin'),
path('callback', views.callback, name='callback'),

次に、読者の情報を取得します。 ./tutorial ディレクトリにgraph_helper.py という名前の 新しいファイルを作成します。

graph_helperファイルは、Microsoft Graph から他のMicrosoft サービスにデータを取得する方法をこのファイルに記載します。このファイルにはMicrosoft GraphのAPIで入力します。Microsoft 公式 Web サイトに使用できるAPIリストを参照してください。

import requests
import json

graph_url = 'https://graph.microsoft.com/v1.0'

def get_user(token):
# Send GET to /me
user = requests.get(
'{0}/me'.format(graph_url),
headers={
'Authorization': 'Bearer {0}'.format(token)
},
params={
'$select': 'displayName,mail,mailboxSettings,userPrincipalName'
})
# Return the JSON result
return user.json()

graph_helper機能をview.pyにインポートします。

from tutorial.graph_helper import *

次に、auth_helper.pyファイルでAzure AD からの戻り値を記録する機能を作成します。

def store_user(request, user):
try:
request.session['user'] = {
'is_authenticated': True,
'name': user['displayName'],
'email': user['mail'] if (user['mail'] != None) else user['userPrincipalName'],
'timeZone': user['mailboxSettings']['timeZone']
}
except Exception as e:
print(e)

def get_token(request):
cache = load_cache(request)
auth_app = get_msal_app(cache)

accounts = auth_app.get_accounts()
if accounts:
result = auth_app.acquire_token_silent(
settings['scopes'],
account=accounts[0])

save_cache(request, cache)

return result['access_token']

def remove_user_and_token(request):
if 'token_cache' in request.session:
del request.session['token_cache']

if 'user' in request.session:
del request.session['user']

store_user : Azure AD からの戻り値が読者ー情報となり、合っているかどうかを確認する機能かあります。
get_token : Azure AD からの戻り値がtokenとなり、合っているかどうかを確認する機能かあります。
remove_user_and_token : 証明書の期限が切れた場合にセッションを削除する機能かあります。

次に、./tutorial/views.py のコールバックの内容を下記のコードに置き換えます。

def callback(request):
# Make the token request
result = get_token_from_code(request)

#Get the user's profile
user = get_user(result['access_token'])

# Store user
store_user(request, user)
return HttpResponseRedirect(reverse('home'))

views.py にの下記インポート文をファイルの先頭に追加します。これで、auth_helper機能をインポートします。

from tutorial.auth_helper import *

最後に、サインアウトを実装します。 ./tutorial/views.pyファイル 下記 の内容を追加します。

def sign_out(request):
# Clear out the user and token
remove_user_and_token(request)

return HttpResponseRedirect(reverse('home'))

url.py ファイルにパスを追記することを忘れないでください。

path('signout', views.sign_out, name='signout'),

上記のステップを完了しましたら、ブラウザでlocalhost:8000を開きまして、Microsoft アカウントにログインすると、次のような画面が表示されます。

ファイルの説明

上記のステップで作成したファイルについて簡単に説明します。

  1. oauth_settings.yml: Azure AD にアクセスする情報を記録します
  2. auth_helper.py:クラウドからデータを読み取る機能を記載します
  3. views.py: ウェブサイト運営する機能を記載します
  4. graph_helper.py: コマンドを記録する機能を記載します
  5. urls.py: views.py 内の 機能をマッピングする機能を記載します

また、Microsoft データベースから 送信されるデータはJSON方式かあります。したがって、読者は JSON 方式のデータが Django でどのように処理されるかについて基本的な知識を持っている必要があります。

まとめ

この投稿では、初心者が Microsoft Graph API を使用する方法について説明しました。使いやすくするために必要最低限の機能をいくつか上げました。 私はこの記事が読者の役に立てることを願っています。