質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5519閲覧

C#でのMicrosoft Graph トークンの取得について

chris_k

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/10/26 02:32

編集2017/10/26 05:47

C#でMicrosoft Graphを用いるアプリの開発を行っております。

下記リンクのように
ユーザーの代わりにアプリケーションがアクセス許可を取得し
Microsoft Graphからユーザー情報を取得したいと考えております。

ユーザーなしでアクセスを取得

手順としては、以下のようなPOST要求でトークンを取得すると書いてあります。

POST /{tenant}/oauth2/v2.0/token HTTP/1.1

Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865

&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials

しかし、webアプリ開発の経験が無く
うまくPOST要求ができず、レスポンスが返ってきません。

このため、C#でPOST要求を行い、レスポンスを受け取るまでの方法を
アドバイスいただけますでしょうか

よろしくお願いいたします。

追記事項

現在実装しているコードを追記致します。

C#

1string url = "https://login.microsoftonline.com/common/oauth2/token"; 2 var nvc = new List<KeyValuePair<string, string>>(); 3 nvc.Add(new KeyValuePair<string, string>("client_id", "3181129a-*******")); 4 nvc.Add(new KeyValuePair<string, string>("scope", "https://graph.microsoft.com/.default")); 5 nvc.Add(new KeyValuePair<string, string>("client_secret", "******************")); 6 nvc.Add(new KeyValuePair<string, string>("grant_type", "client_credentials")); 7 var client = new HttpClient(); 8 var req = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(nvc) }; 9 var res = await client.SendAsync(req);

現在、レスポンス自体は返ってきておりますが
以下の様な意図しない形式となっております。

StatusCode: 400,

ReasonPhrase: ‘Bad Request’,
Version: 1.1,
Content: System.Net.Http.StreamContent,
Headers: {
Pragma: no-cache Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff x-ms-request-id: 1b5a4e18-428d-4fb5-a611-2e6856ff0800
Cache-Control: no-store, no-cache P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" Set-Cookie: esctx=AQABAAAAAABHh4kmS_aKT5XrjzxRAtHz0bD6HfoCO6c1iY5rcV7Yv34N6jErn-UFuSw5FEUMBsNMZ1UgSZjrKClzkcztzIxzxiTCcny9c5ji8AIqda5wXfECjs6t1IpGT7j6aJRXR4mw8v9uPzAAmExtHnQ5wdMiHULc8XM9oBd8GDpPPs222T5oVYoRFzzljdV0-RdbA0kgAA;
domain=.login.microsoftonline.com; path=/; secure; HttpOnly Set-Cookie: x-ms-gateway-slice=008; path=/; secure; HttpOnly Set-Cookie: stsservicecookie=ests; path=/; secure; HttpOnly Server: Microsoft-IIS/8.5 X-Powered-By: ASP.NET Date: Thu, 26 Oct 2017 05:37:45 GMT Content-Length: 468 Content-Type: application/json; charset=utf-8 Expires: -1
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2017/10/26 04:01

現在うまく行ってない実装を提示してください。
chris_k

2017/10/26 05:21

現在の実装を追記いたしました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

うまくPOST要求ができず、レスポンスが返ってきません

とのことですが、本当にレスポンス返ってこないですか?
コピペして呼び出ししただけでもレスポンスは返ってきました。
Postmanで確認してもレスポンスは返ってきますし、APIが吐いたエラー内容も確認できてます。

※もちろんトークン自体の取得は失敗してますが

投稿2017/10/26 05:33

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chris_k

2017/10/26 05:41

ただ今、この部分のみでの動作を確認したところレスポンス自体は返ってきました。 しかし、Microsoftのページにあるような { "token_type": "Bearer", "expires_in": 3599, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBP..." } といった形式ではなく、追記したもののような形となっております。 お手数をおかけしますが、ご確認頂けますと幸いです。
Tak1wa

2017/10/26 06:00

HttpResponseMessageから中身を取り出す必要があります。このAPIだとJsonでエラーメッセージが帰ってくるようなので、以下のようにすればJson文字列形式でエラー内容を確認できると思います。 `var result = await res.Content.ReadAsStringAsync()` 確認が出来たら、なぜそのエラーメッセージが表示されているのがGraph APIの仕様や使い方などを再確認しましょう。
chris_k

2017/10/26 09:43

頂いたコードを用いて、エラー内容を読んだところ テナント情報が正しくないとのことでしたので、commonの部分を自分のテナント情報に置き換えたところ 正しくアクセストークンを取得することができました。 何度もご回答いただきありがとうございました。お手数をおかけいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問