Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Easy Auth の Tokenで Graph APIを呼び出す

前回の記事 で Azure Web Apps の Easy Auth 情報をASP.NET Coreで受け取る - Azureの小ネタ (改) の続き的な記事で、Easy Authで受け取ったTokenでGraph APIをたたきたい場合です。

Easy Authで認証すると、X-MS-TOKEN-AAD-ACCESS-TOKEN にToken情報が入ってきますが、このTokenを使ってGraph APIは叩けません。

f:id:StateMachine:20180703122327p:plain

Graph APIを叩けるTokenを得るには、以下の操作をする必要があります。

準備

1) リソースエクスプローラ https://resources.azure.com/ を開く

2) 以下までTreeを展開する

3) additionalLoginParams を探して、以下のように定義し、POST(保存)します。

{
    "additionalLoginParams": ["response_type=code id_token", "resource=https://graph.windows.net"],
}

再度、アクセスすると、X-MS-TOKEN-AAD-ACCESS-TOKEN の値がJWTぽく変わっていることがわかります。

f:id:StateMachine:20180703124528p:plain

https://jtw.ms/ あたりでデコードしてみると、audience に Graph API のURLが確認できます。

f:id:StateMachine:20180703124659p:plain

Graph API を graph.microsoft.com にすることもできます。ただし、同時に複数のAudienceを指定することはできません。

アクセス例

以下は、↑と違って、graph.microsoft.com にアクセスする例です。Graph API SDKをNugetでインストールしておいてください。

        public async Task<IActionResult> GetMeAsync()
        {
            if (!this.HttpContext.Request.Headers.ContainsKey("X-MS-TOKEN-AAD-ACCESS-TOKEN"))
            {
                return Ok();
            }

            var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(requestMessage => {
                requestMessage
                    .Headers
                    .Authorization = new AuthenticationHeaderValue("bearer", this.HttpContext.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"]);

                return Task.FromResult(0);
            }));

            var user = await graphServiceClient.Me.Request().GetAsync();
            return new JsonResult(user);
        }

ブラウザで直接APIをたたくと、User情報のJSONが取得できると思います。

以上