Azure FunctionsでToken Bindingを使って、Azure Active DirectoryによるOAuth認証をラクチンにする

こんにちは、サイオステクノロジー技術部 武井です。

※本記事の英語版はこちら(Click here to read in English)

Office365の各種機能をRestfulなAPIで操作したい場合は、Graph API一択になると思います。ただ、Graph APIは、Azure Active DirectoryによるOAuth認証が必要になります。ただ、OAuthの認証って実はかなりめんどくさいです。最初にアクセストークンを作るときには認可エンドポイントにアクセスして、認可コードを取得して、その認可コードをトークンエンドポイントに渡して、初めてアクセストークンが取得できますが、その後も、リフレッシュトークンを利用して、定期的にアクセストークンを再生成しないといけません。

実は、Azure Functionsの場合、このあたりの一連の処理を「Token Binding」を使うことによって非常に簡単に実現できます。「Token Binding」は「HTTP Trigger Binding」や「Queue Trigger Binding」の親戚みたいなものです。

では早速、実演してみたいと思います。やり方は色々あるのですが、Visual StudioでC#で書いてから、Azure Portalに発行するという方法でやってみたいと思います。

Azure Active Directoryにアプリケーションの登録は済んでいるものします。Azure Functionsの設定画面で「プラットフォーム機能」→「承認/認証」の順にクリックします。

Screen Shot 2019-02-07 at 22.04.46

 

「App Service認証」を「オン」にして、認証プロバイダーの「Azure Active Directory」をクリックします。

Screen Shot 2019-02-07 at 22.09.29

 

ここでは、Azureを管理しているAzure Active Directoryと、Office365を管理しているAzure Active Directoryが別とします。そういうケースが多いと思います。ということで、「詳細」をクリックします。「クライアントID」「クライントシークレット」には、Azure Active Directoryに登録したアプリケーションのクライントID、クライントシークレットを入力します。「発行者のURL」には、「https://sts.windows.net/[テナントID]」を入力して、「OK」をクリックします。

Screen Shot 2019-02-07 at 22.12.52

次にアクセストークンを取得するコードを書きましょう。あ、その前にVisual StudioのNuGetパッケージマネージャーで以下のライブラリを取得してください。Visual Studio 2017ですと、「ツール」→「NuGetパッケージマネージャー」→「ソリューションのNuGetパッケージの管理」で以下の画面が表示されますので、検索窓に「Microsoft.Azure.Webjobs.Extensions.AuthTokens」と入力して、検索してください。 表示されたものをインストールしてください。

Screen Shot 2019-02-07 at 19.28.27

 

そして、今度はAzure Functions側に記載するソースコードになります。まんまHTTP Triggerのサンプルですが(´・ω・`)

ポイントは[Token]…以降の属性の部分です。これがToken Bindingになります。こちらも方法は色々ありますが、graphTokenにOAuthのアクセストークンを入れる場合は以下のように記載してください。

[Token(IdentityProvider = AAD, Resource = https://graph.microsoft.com/, Identity = TokenIdentityMode.ClientCredentials)]string graphToken

こちらのコードをAzureに発行して、実行すると、Access Token:の後にOAuthのアクセストークンが表示されます。アクセストークン生成やリフレッシュトークンの呪縛から解き放たれました。

ラクチンですね。癖になりそうです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*