본문 바로가기
  • _^**_
IT지식창고/C#

[무근본 C#] OAuth 2.0 인증 프로토콜 사용방법 예제

by 크리드로얄워터 2023. 4. 18.
반응형

[질문]

 

안녕하세요 제가 게임 서드 파티 프로그램을 만드는 중인데, 사용자 정보를 사용해야되서 게임회사에서 제공하는 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

댓글