PowerShellを用いたAPI利用時のスコープ指定仕様と設定方法

本記事では、PowerShellを使用してAPIにアクセスする際に必要な、アクセストークンのscopeを指定する方法について説明します。

  • この記事でわかること
    • トークンを取得する際に設定するscopeの設定方法

Microsoft Graph APIを利用する

PowerShellコマンドを利用し、特定のテナントへアクセスしてGraph APIを実行したい場合、沢山の方法がありますが、一般的に見られるのは「Invoke-RestMethod」や「Invoke-WebRequest」で実施するものかと思います。

※「Microsoft.Identity.Client」を利用するなど他に実装方法はある認識です。

その場合以下のように記載しているかと思います。

#環境変数などをあらかじめ格納しています。
$clientId = 'クライアントID'
$clientSecret = 'クライアントシークレット'
$tenantId = "テナントID"
$scope = 'https://graph.microsoft.com/.default'
$tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$graphUrl = "実行したいコマンド"

#送信するパラメーターを設定しています。
$postParams = @{
    client_id = $clientId;
    client_secret = $clientSecret;
    grant_type = 'client_credentials';
    scope = $scope
}

#アクセストークンを取得しています。
$authResult = (Invoke-WebRequest -Uri $tokenEndpoint -Method POST -ContentType "application/x-www-form-urlencoded" -Body $postParams) | ConvertFrom-Json

#認証用ヘッダーを作成しています。
$headers = @{
	"Authorization" = ("Bearer {0}" -f $authResult.access_token);
	"Content-Type" = "application/json";
}

#実施したいコマンドをヘッダーを付けて送信しています。
$response = Invoke-RestMethod -Uri $graphUrl -Headers $headers -Method Get

上記をコピーして、Graph APIの認証用のアプリケーション情報とテナント情報を指定すれば、グループの情報を取得やユーザーの属性の確認ができます。

カスタムAPIを利用する

App Serviceに誰かがリリースしたアプリケーションに接続する際など、APIを利用するのはGraph APIに限った話ではない認識です。

その際でも、クライアントIDやシークレットについては特に問題なく設定できるかと思いますが、scopeは書き方が変わるので少し注意が必要です。

{アプリケーションID}はApp ServiceサブスクリプションID(GUID)などです。

#環境変数などをあらかじめ格納しています。
$clientId = 'クライアントID'
$clientSecret = 'クライアントシークレット'
$tenantId = "テナントID"
$AppID = '11111111-1111-1111-1111-111111111111'
$tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$graphUrl = "実行したいコマンド"

#送信するパラメーターを設定しています。
$postParams = @{
    client_id = $clientId;
    client_secret = $clientSecret;
    grant_type = 'client_credentials';
  scope = ("api://{0}/.default" -f $AppID)
}

#アクセストークンを取得しています。
$authResult = (Invoke-WebRequest -Uri $tokenEndpoint -Method POST -ContentType "application/x-www-form-urlencoded" -Body $postParams) | ConvertFrom-Json

#認証用ヘッダーを作成しています。
$headers = @{
	"Authorization" = ("Bearer {0}" -f $authResult.access_token);
	"Content-Type" = "application/json";
}

#実施したいコマンドをヘッダーを付けて送信しています。
$response = Invoke-RestMethod -Uri $graphUrl -Headers $headers -Method Get

このように設定すれば問題ありません。

終わりに

Graph APIは頻繁に利用しますが、カスタムAPIはたまにしか使用しません。

そのため、カスタムAPIを利用する際は毎回この設定がなんだったのかを忘れてしまったり、必要な認証情報にアプリケーションIDを入れ忘れてしまったりしていました。

今後はこの記事を読み返して思いだしたいと思います。皆さんも思い出す際に利用いただければ幸いです。

執筆担当者プロフィール
千葉 泰規

千葉 泰規(日本ビジネスシステムズ株式会社)

デジタルイノベーション部所属。 取り扱う技術:C#,PowerShell,DevOps,Azure アプリ開発など主にしています。

担当記事一覧