Meine WPF-Desktopanwendung (C#) versucht, die Outlook-E-Mails des Benutzers über die Microsoft Graph-API zu lesen. Ich bin im Authentifizierungsprozess festgefahren. Ich habe bereits mit einem Code-Authentifizierung und jetzt versuche ich ein Zugriffstoken von Azure zu bekommen, aber halten Sie einen HTTP 400-Fehlercode erhalten, wenn die Anforderung für den Zugriffstoken aussendet:Azure AD OAuth2-Zugriffstokenanforderungsfehler - 400 ungültige Anforderung
/**** 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
}
Die oben ist der Code, der zum Abrufen des Authentifizierungscodes verwendet wird, gefolgt von dem Versuch, das Zugriffstoken abzurufen. Wir haben kein client_secret, da Secrets nur für Webanwendungen gelten und dies eine native Desktop-WPF-Anwendung ist. Ich habe gelesen, dass dies kein Problem ist. Ich habe viele Tutorials und offizielle Dokumente online verfolgt, hauptsächlich the official Graph authorization doc und ich kann immer noch nicht herausfinden, was ich falsch mache. Jede Hilfe würde sehr geschätzt werden, danke.
Können Sie die volle 400 Fehlermeldung, die Sie erhalten, bitte zurückgeben (oder wie Robert sagt, eine vollständige Fiddler-Ablaufverfolgung). Sind Sie sicher, dass Ihre App als nativer Client (oder öffentlicher Client) und nicht als Webanwendung registriert ist? Native/öffentliche Clients benötigen kein Geheimnis, um den Code für ein Zugriffstoken einzulösen. –
Vielen Dank für beide Antworten! Fiddler hat mir geholfen, das 400-Fehler-Problem zu lösen - es stellte sich heraus, dass mein Autorisierungscode abgelaufen war. Ich stehe nun vor einem neuen Problem, bei dem die Zugriffstokenantwort kein json-Objekt ist, das das Zugriffstoken enthält (wie ich es erwartet habe), sondern ein HTML-Dokument. Hier ist der Fiddler-Trace: https://drive.google.com/file/d/0B9w2-YCX6qYvZmxXdERjWDJsamM/view?usp=sharing – Midas
Dieser Aufruf scheint ein POST für den Endpunkt/authorize zu sein. Sie sollten einen POST-Vorgang für den/token-Endpunkt ausführen, um einen Autorisierungscode in ein Zugriffstoken zu ändern. –