2016-07-29 5 views
1

내 WPF 데스크톱 응용 프로그램 (C#)이 Microsoft Graph API를 통해 사용자의 Outlook 전자 메일을 읽으려고합니다. 나는 인증 과정에 갇혀있다. 이미 인증 코드를받은 지금은 푸른에서 액세스 토큰을 얻을 수 있지만, 액세스 토큰에 대한 요청 밖으로 보낼 때 HTTP 400 오류 코드가 계속하려고 해요 : 위의Azure AD OAuth2 액세스 토큰 요청 오류 - 400 잘못된 요청

/**** 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 
} 

을 액세스 코드를 검색하려고 시도한 인증 코드를 검색하는 데 사용되는 코드입니다. 비밀은 웹 응용 프로그램에만 해당되며 기본 데스크탑 WPF 응용 프로그램이므로 client_secret이 없습니다. 나는 이것이 문제가 아니라는 것을 읽었습니다. 나는 대부분 the official Graph authorization doc과 많은 튜토리얼과 공식 문서를 온라인으로 따라 왔으며 아직도 내가 잘못하고있는 것을 파악할 수 없다. 어떤 도움이라도 대단히 감사하겠습니다. 감사합니다.

답변

2

fiddler을 사용하여 요청을 디버깅했으며 전체 오류 메시지를 발견했습니다. 사용자 또는 관리자가 응용 프로그램 사용에 동의하지 않았습니다. 이 메시지를 조금 봤더니 몇 가지 스택 기사와 github 문제 해결 스레드가 나와 해결책을 찾았습니다. 내 요청은 기본 URL에서 "Azure 세입자를 실제로 사용해야 할 때 임차인 ID로"일반적인 URL을 사용했습니다. 이 answer on stack을 통해 취득한 ID입니다. 인증 요청에 대한 내 새 기본 URL은 지금과 같이 보인다 : "XXXX이 XXX -...."당신의 푸른 세입자 ID로 대체 될

https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/authorize 

!

0

클라이언트 암호를 사용하지 않으면 암시 적 부여 플로를 지원하도록 테넌트를 구성해야합니다. this 블로그 게시물의 지침에 따라 구성을 수행/검증 할 수 있습니다. 이를 위해서는 Azure 관리 포털을 사용하여 앱 매니페스트를 다운로드하고 수정 한 다음 업로드해야합니다.

또는 더 좋은 전략은 converged v2.0 authentication endpoints을 사용하여 코드를 전환하는 것입니다. new app registration portal을 사용하여 응용 프로그램을 관리 할 수 ​​있으며 암시 적 플로우 및 동적 범위를 잘 지원합니다. 실제 인증 흐름 here에 대한 자세한 정보를 찾을 수 있습니다. 지금하고있는 일과 그리 멀지는 않으며 몇 가지 작은 조작 만하면됩니다.

이후에도 문제가 계속되면 다시 문의하십시오. 피 들러/네트워크 추적이 매우 유용합니다. 또한 예외 내의 자세한 메시지도 매우 유용합니다.

+0

전체 400 오류 메시지를 제공 할 수 있습니까 (또는 Robert가 말한 것처럼 완전히 피들러 추적). 또한 앱이 웹 앱이 아닌 기본 클라이언트 (또는 공개 클라이언트)로 등록되어 있는지 확인하십시오. 네이티브/공용 클라이언트가 액세스 토큰에 대한 코드를 사용하도록 암호를 요구하지 않습니다. –

+0

답장을 보내 주셔서 감사합니다. Fiddler는 400 오류 문제를 해결하는 데 도움을주었습니다. 인증 코드가 만료 되었음이 드러났습니다. 지금은 액세스 토큰 응답이 json 객체 (예 : 예상 한 것처럼)가 아니라 html 문서 인 새로운 문제에 직면하고 있습니다. 다음은 피들러 추적입니다. https://drive.google.com/file/d/0B9w2-YCX6qYvZmxXdERjWDJsamM/view?usp=sharing – Midas

+0

해당 호출이/authorize 끝점에 대한 POST 인 것 같습니다. 인증 코드를 액세스 토큰으로 변경하려면/토큰 엔드 포인트에 POST를 수행해야합니다. –