AzureでAccessTokenを取得する方法

スポンサーリンク

AzureでAccessTokenを取得する方法についておさらいしたので備忘も含めて記載していきます。

そもそもなぜAccessTokenについて調査をしたかというとAzureRestAPIの利用方法について研究しておりまして、RestAPIを実行するにあたってHTTP HeaderにAuthorizationとしてAccessTokenを付与する必要があります。AccessToken自体はAzureにログインしている状態であればCloud ShellやPowerShellで取得することができます。

ただしサインイン情報を保持していない限り、AccessTokenはExpireTimeを持っているため現在ログインしている状態で取得したAccessTokenは60分で権限が破棄されます。AccessToken自体はAPIで取得できるのその点についても言及しようと思います。

Azure Rest API ブラウザー

Azure Rest API Reference

※本記事は2018年10月8日の情報になります。

Azureにログイン時のAccessTokenを取得する

ここではCloud Shellを利用してログイン中のAccessTokenを取得します。ここで利用するのはBashです。

AzurePortalにログインして右上にあるCloud Shellをクリックします。

このまま実行してもいいのですが操作しずらいのでAzure Cloud Shell専用の画面に移動します。Azure Cloud Shell専用の画面はVS Codeの機能を実装したので操作しやすいです。

Cloud Shellの画面に遷移したらBashを選択し下記のコマンドを実行します。

az account get-access-token

実行すると現在のAccessTokenが表示されます。expiresoOnがN/Aになっていますがこれは私の環境がMFAでログインしておりサインインを継続する設定になっているためです。サインインを継続しない設定の場合はAccessTokenga廃棄される時間帯が表示されます。

SubscriptionやtenatIdは危険なのでマスクしてあります。この方法であれば簡単にAccessTokenを取得することができます。

AccessTokenを非対話型で取得するための準備

AccessTokenはログインしていなくてもRest API経由で取得することができます。AzureADにアプリ登録を行い、取得できる各種設定値を利用してAPI経由で取得する形になります。

ログイン画面を経由せずにAzureのAPIとやり取りする方法を「非対話型」といいます。反対にログイン画面を経由してAzureにアクセスる方法を「対話型」といいます。

今回必要になるのは下記の4種類の情報です

  • ClientId
  • ClientSecret
  • TenantId
  • SubscriptionId(無くても問題なし)

この4つの情報ですがSubscriptionId以外はAzurePortal上では別の名称になっているので注意が必要です。名称の組み合わせと取得場所は下記のとおりです。

  • ClientId => アプリケーションID(AzureADのアプリ登録から取得)
  • ClientSecret => キー値 (AzureADのアプリ登録、キーから取得)
  • TenantId => ディレクトリId(AzureADのプロパティから取得)

それではIDを入手していきましょう。

※これからの作業はすべて共同管理者か所有者ロールのユーザで行ってください。

AzurePortalを開いて、Azure Active Directoryから「アプリの登録」→「新しいアプリケーションの登録」を選択します。

新しいアプリケーションの登録ブレードでアプリを作成します。

名前には任意の名前を入力します。

アプリケーションの種類はここでは「Web アプリ/API」を選択します。クライアントアプリやモバイルアプリ等の登録時は「ネイティブ」を選択しましょう。

サインオンURLは適当なURLで構いません。認証サイトを別に持っている場合はそのURLを入力しますがここでは利用しないので適当に入力してください。

入力が完了したら完了ボタンを選択します。

アプリが作成されたらひとまずアプリケーションIDをメモ帳などにメモっておきます。これが「Client Id」になります。

次に「設定」を選択しアクセス許可とキーを作成します。

設定画面が開いたら「必要なアクセス許可」→「追加」→「1APIを選択します」から「Windows Azure Serivce Managment API」を選択します。APIの種類は他にもありますがAccessTokenを取得する場合はこのAPIを選択してください。

次にアクセス許可を付与します。「アクセス許可を選択します」を選択して「アプリケーションのアクセス許可」と「委任されたアクセス許可」にチェックを入れて保存します。

アクセス許可の設定が完了すると一覧に表示されます。

次にキー値を作成します。「キー」を選択してキー登録画面に移動します。

キーの新規登録を行います。まずはキーの説明に任意の名称を入力してください。次に有効期限を設定します。有効期限は1年、2年、制限なしが選択できます。1年と2年は本日より1年後、2年後が有効期限となります。制限なしを選択すると2299/12/31が自動的に設定されます。ここでは制限なしを選択しています。

設定後に保存を選択すると値が自動生成されます。注意文言にもある通り移動すると取得できなくなるのでここで必ず値のメモを取りましょう。メモを忘れると作り直しになります。ここで取得するキー値が「Client Secret」になります。

次にディレクトリIdを取得します。「Azure Active Directory」→「プロパティ」で「ディレクトリId」を取得します。これが「TenantId」になります。

これで必要な情報はすべて取得できました。最後にサブスクリプションにアクセス許可の追加を登録します。

009.png

現在のサブスクリプションを選択します。全てのサービスから全般項目でサブスクリプションを選ぶかフィルターにサブスクリプションと入力して選択してください。ここでついでにSubscriptionIdを取得しておきましょう。これでRestAPIで必要なる4つの神器がそろったことになります。

サブスクリプションのメニューから「アクセス制御(IAM)」を選択し「追加」を選択します。

アクセス許可の追加を行います。

役割には共同作成者を選択します。本来であればここではAzure Management API Operatorを選択するべきですが設定を楽にするために共同管理者を選択しています。

アクセスの割当先は「Azure ADのユーザー、グループ、またはアプリケーション」を選択します。

選択では登録したアプリ名を入力します。ここではdemoappと作成したのでdemoと入力し検索しています。表示されたアプリを選択して追加しましょう。

役割別にロールを正確に設定する必要があります。役割の詳細については下記を参考にしてください。

アクセス許可の追加を行うと共同作成者にdemoappが追加されています。

これで各種設定は完了です。そこそこやることは多いですが慣れてくると5分くらいで操作完了できます。

非対話型でAccessTokenを取得する

これまでの捜査でRestAPIにアクセスするために必要な4つの情報を取得できたと思います。

  • ClientId
  • ClientSecret
  • TenantId
  • SubscriptionId(ここでは無くても問題なし)

この4つの情報を利用してRestAPI経由でAccessTokenを取得してみましょう。ここではPostmanを利用してRestAPIを実行します。

ログインするためのAPIは下記のURLになります。

https://login.microsoftonline.com/{TenantId}/oauth2/token

PostmanでこのURLにPOSTを行いAccessTokenを取得します。URLの{TenantId}部分は先に取得したTenantIdに置き換えておきましょう。

Postmanを起動したらURLの部分にログインAPI用のURLをコピペします。次にHTTPアクセスをPOSTに変更しましょう。Headersタブを選択してHeaderを追加します。KEYに「Content-Type」、VALUEに「application/x-www-form-urlencoded」を設定します。

次にリクエストBodyを作成するためにBodyタブを選択して「x-www-form-urlencoded」を指定します。指定したら下記の情報を追加します。

全て設定したらSendボタンを実行します。

うまく設定できていれば上記の図のようにaccessTokenが取得できていると思います。エラーが返ってきた場合はもう一度設定を見直しましょう。

これで非対話型でAccessTokenを取得することができました。次回のブログ記事はこのAccessTokenを利用してAzure Rest APIをLogicFlowから定期的に実行するフローの作成について書こうと思います。

コメント