2016-07-29 17 views
1

私のWPFデスクトップアプリケーション(C#)がMicrosoft Graph APIを通じてユーザーのOutlook電子メールを読み取ろうとしています。私は認証プロセスに悩まされています。 Iすでに認証コードを受け取ったと今、私はアズールからアクセストークンを取得しようとしているが、トークンアクセスの要求送信するとき、HTTP 400エラーコードを取得しておいてください。Azure AD OAuth2アクセストークン要求エラー - 400 Bad Request

/**** Auth Code Retrieval ****/ 
string authCodeUrl = "https://login.microsoftonline.com/common/oauth2/authorize"; 
authCodeUrl += "?client_id" = clientId; 
authCodeUrl += "&redirect_uri=" + redirectUri; 
authCodeUrl += "&response_type=code"; 
authCodeUrl += "&resource=https%3A%2F%2Fgraph.microsoft.com%2F"; 
Process.start(authUrl); // User logs in, we get the auth code after login 
string code = "......"; // Hidden for this post 

/**** Access Token Retrieval ****/ 
string tokenUrl = "https://login.microsoftonline.com/common/oauth2/token" 
string content = "grant_type=authorization_code"; 
content += "&client_id=" + clientId; 
content += "&resource=https%3A%2F%2Fgraph.microsoft.com%2F"; 
content += "&code=" + code; 
content += "&redirect_uri=" + redirectUri; 
WebRequest request = WebRequest.Create(tokenUrl); 
request.ContentType = "application/x-www-form-urlencoded"; 
byte[] data = Encoding.UTF8.GetBytes(content); 
request.ContentLength = data.Length; 
request.Method = "POST"; 
try 
{ 
    using (Stream stream = request.GetRequestStream()) 
    { 
    stream.Write(data, 0, data.Length); 
    } 
    WebResponse response = request.GetResponse(); // This throws exception 
} 
catch (Exception error) // This catches the exception 
{ 
    Console.WriteLine(error.Message); // Outputs 400, bad request 
} 

上記のアクセスコードを取得しようとする認証コードを取得するために使用されるコードです。シークレットはWebアプリケーションのみのため、これはネイティブデスクトップWPFアプリケーションであるため、client_secretはありません。私はこれが問題ではないことを読んだ。私は多くのチュートリアルと公式の文書をオンラインで、主にthe official Graph authorization docに従ってきましたが、私はまだ間違っていることを理解できません。どんな助けでも大歓迎です、ありがとうございます。

答えて

2

fiddlerを使用してリクエストをデバッグしましたが、完全なエラーメッセージが表示されました。ユーザーまたは管理者がアプリケーションの使用に同意していません。私はこのメッセージをちょっと調べて、いくつかのスタック記事とgithubを見つけて、私に解決策を教えてくれました。私の要求は、実際に私のAzureテナントを使用する必要があるときに、テナントIDとして "common"このanswer on stackで取得したIDです。認証要求のための私の新しいベースURLは現在のようになります。

「XXXX -.... XXX」
https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/authorize 

あなたAzureのテナントIDに置き換えられます!

0

クライアントシークレットを使用しない場合、暗黙の許可フローをサポートするようにテナントを設定する必要があります。 thisブログ記事の指示に従って、設定を実行/検証することができます。これには、Azure管理ポータルを使用してアプリケーションマニフェストをダウンロード、変更、アップロードする必要があります。

converged v2.0 authentication endpointsを使用するようにコードを切り替えることもできます。 new app registration portalを使用してアプリケーションを管理することができ、暗黙のフローと動的スコープをうまくサポートします。実際の認証フローの詳細はhereです。あなたが今やっていることから遠くなく、ほんの少しの微調整が必​​要です。

これ以降も問題が解決しない場合は、もう一度お問い合わせください。フィドラー/ネットワークトレースは非常に役に立ちます。また、例外内の詳細なメッセージも非常に役立ちます。

+0

返信いただいた400のエラーメッセージを提供することができますか(ロバート氏が言うように、完全なフィドラートレース)。また、あなたのアプリがWebアプリケーションではなく、ネイティブクライアント(またはパブリッククライアント)として登録されていることを確認していますか?ネイティブ/パブリッククライアントは、アクセストークンのコードを償還するための秘密を必要としません。 –

+0

お返事ありがとうございます!フィドラーは私が400エラーの問題を解決するのを助けました - それは私の認証コードが期限切れになったことが判明しました。私は現在、アクセストークンの応答がアクセストークンを含むjsonオブジェクトではない(期待どおりの)新しい問題に直面していますが、htmlドキュメントです。フィドラートレースは次のとおりです。https://drive.google.com/file/d/0B9w2-YCX6qYvZmxXdERjWDJsamM/view?usp=sharing – Midas

+0

その呼び出しは/ authorizeエンドポイントのPOSTのようです。認証コードをアクセストークンに変更するには、/トークンエンドポイントにPOSTを実行する必要があります。 –

関連する問題