[질문]
안녕하세요 제가 게임 서드 파티 프로그램을 만드는 중인데, 사용자 정보를 사용해야되서 게임회사에서 제공하는 OAuth 2.0 을 사용하면된다고 안내를 해주더구요. 그래서 이걸 이용해서 만들려고 하는데 잘 되지 않아 도움이 필요합니다. 사용하고 있는 언어는 C#입니다.
string authorizationEndpoint = "인증 엔드포인트";
string tokenEndpoint = "토큰 엔드 포인트";
string clientId = "클라이언트 아이디";
string clientSecret = "비밀번호";
string redirectUri = "콜백";
string state = Guid.NewGuid().ToString();
string scope = "요청할 정보";
string responseType = "code";
string authorizationRequest = $"{authorizationEndpoint}?response_type={responseType}&client_id={clientId}&redirect_uri={Uri.EscapeDataString(redirectUri)}&state={state}&scope={scope}";
System.Diagnostics.Process.Start(authorizationRequest);
여기까지는 잘 작동하고 있는 것 같습니다. 이걸 실행하면 로그인 페이지가 열리고 로그인 하면 확인 페이지까지 잘 나오는데 인증 확인 버튼을 누르면 그 다음으로 넘어 가야되는데 그 다음으로 안넘어갑니다. 그냥 그 인증 확인 페이지에서 더이상 진행이 되질 않아요
제가 봤을때는 사이트에서 인증이 성공하면 인증 코드나 토큰을 보내면 프로그램이 받아서 이것을 처리해야 프로그램이 받은 정보를 사용할 수 있을 것 같은데 이곳에서 막혀 있습니다.
문제가 있다고 생각하는 코드는 아래에 있습니다.
var httpListener = new HttpListener();
httpListener.Prefixes.Add("http://localhost:5000/");
httpListener.Start();
string authorizationCode = HttpUtility.ParseQueryString(request.Url.Query).Get("code");
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{clientId}:{clientSecret}"))}");
var values = new Dictionary
{
{ "grant_type", "authorization_code" },
{ "code", authorizationCode },
{ "redirect_uri", redirectUri }
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(tokenEndpoint, content);
string responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
[답변]
인증 확인 페이지에서 더 이상 진행되지 않는 문제는 사용자 인증 후 인증 코드가 리디렉션 된 URI에 반환되지 않기 때문에 발생할 수 있습니다.
올바른 인증 코드를 수신하기 위해 로컬 웹 서버를 시작한 다음 리디렉션 URI로 설정해야합니다. 그러면 OAuth 2.0 공급자는 사용자 인증 후 인증 코드를 해당 리디렉션 URI에 반환합니다.
따라서, 코드의 빠진 부분은 다음과 같습니다.
var httpListener = new HttpListener();
httpListener.Prefixes.Add(redirectUri);
httpListener.Start();
var context = await httpListener.GetContextAsync();
string authorizationCode = HttpUtility.ParseQueryString(context.Request.Url.Query).Get("code");
httpListener.Stop();
이 코드를 추가하면 리디렉션 URI에서 인증 코드를 정상적으로 수신 할 수 있어서 토큰 엔드포인트에서 토큰을 받아올 수 있습니다.
아래는 전체 코드입니다.
string authorizationEndpoint = "인증 엔드포인트";
string tokenEndpoint = "토큰 엔드 포인트";
string clientId = "클라이언트 아이디";
string clientSecret = "비밀번호";
string redirectUri = "http://localhost:5000/";
string state = Guid.NewGuid().ToString();
string scope = "요청할 정보";
string responseType = "code";
string authorizationRequest = $"{authorizationEndpoint}?response_type={responseType}&client_id={clientId}&redirect_uri={Uri.EscapeDataString(redirectUri)}&state={state}&scope={scope}";
System.Diagnostics.Process.Start(authorizationRequest);
var httpListener = new HttpListener();
httpListener.Prefixes.Add(redirectUri);
httpListener.Start();
var context = await httpListener.GetContextAsync();
string authorizationCode = HttpUtility.ParseQueryString(context.Request.Url.Query).Get("code");
httpListener.Stop();
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{clientId}:{clientSecret}"))}");
var values = new Dictionary<string, string>
{
{ "grant_type", "authorization_code" },
{ "code", authorizationCode },
{ "redirect_uri", redirectUri }
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(tokenEndpoint, content);
string responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
이제 위 코드를 실행하면, 사용자 인증 후, 인증 코드를 받아서, 토큰을 가져올 수 있습니다.
'IT지식창고 > C#' 카테고리의 다른 글
C#에서 백슬래쉬 출력처리 (0) | 2023.09.21 |
---|
댓글