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

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

ただいまの
回答率

89.64%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,698

chris_k

score 10

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要求を行い、レスポンスを受け取るまでの方法を
アドバイスいただけますでしょうか

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

 追記事項

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

string url = "https://login.microsoftonline.com/common/oauth2/token";
                var nvc = new List<KeyValuePair<string, string>>();
                nvc.Add(new KeyValuePair<string, string>("client_id", "3181129a-*******"));
                nvc.Add(new KeyValuePair<string, string>("scope", "https://graph.microsoft.com/.default"));
                nvc.Add(new KeyValuePair<string, string>("client_secret", "******************"));
                nvc.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
                var client = new HttpClient();
                var req = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(nvc) };
                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 
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2017/10/26 13:01

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

    キャンセル

  • chris_k

    2017/10/26 14:21

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/26 14:41

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

    キャンセル

  • 2017/10/26 15:00

    HttpResponseMessageから中身を取り出す必要があります。このAPIだとJsonでエラーメッセージが帰ってくるようなので、以下のようにすればJson文字列形式でエラー内容を確認できると思います。

    `var result = await res.Content.ReadAsStringAsync()`

    確認が出来たら、なぜそのエラーメッセージが表示されているのがGraph APIの仕様や使い方などを再確認しましょう。

    キャンセル

  • 2017/10/26 18:43

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

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる