API

C# API 2.0 인증

TestGun

2024.02.20읽음 882

작성하신 내용은 누구나 볼 수 있습니다.

계정 이름, 도메인 이름, Client ID, Client Secret 등의 비공개 정보는 기입하지마세요.

안녕하세요

API 2.0 JWT 인증을 하려고 합니다.

C# 소스이며, 인증서버로 토큰 요청할 때 400번 코드로 BadRequest 에러가 납니다.
JWT 토큰 데이터는 에러없이 가져오나, 인증서버 토큰을 가져올떄 에러가 납니다.
1. JWT
static string GenerateJwtToken(string clientId, string serviceAccount, string privateKeyString)
       {
           // RSA 개인키 PEM 문자열을 RSA 개체로 변환
           RSA rsa;
           using (var stringReader = new System.IO.StringReader(privateKeyString))
           {
               var pemReader = new PemReader(stringReader);
               var pemObject = pemReader.ReadObject();
               var rsaParameters = (RsaPrivateCrtKeyParameters)pemObject;
               RSAParameters rsaParams = DotNetUtilities.ToRSAParameters(rsaParameters);
               rsa = RSA.Create();
               rsa.ImportParameters(rsaParams);
           }
           // RSA 개인키를 사용하여 RsaSecurityKey 생성
           var rsaSecurityKey = new Microsoft.IdentityModel.Tokens.RsaSecurityKey(rsa);
           // RsaSecurityKey를 사용하여 SigningCredentials 생성
           var signingCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(rsaSecurityKey, Microsoft.IdentityModel.Tokens.SecurityAlgorithms.RsaSha256);
           // 클레임 세트 정보 설정
           var claims = new[]
           {
               new Claim("iss", clientId),
               new Claim("sub", serviceAccount),
               new Claim("iat", UnixTime.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer),
               new Claim("exp", UnixTime.ToUnixTimeSeconds(3600).ToString(), ClaimValueTypes.Integer)
           };
           // JWT 토큰 생성
           var jwt = new JwtSecurityToken(claims: claims, signingCredentials: signingCredentials);
           // JWT 문자열로 변환
           var tokenHandler = new JwtSecurityTokenHandler();
           var tokenString = tokenHandler.WriteToken(jwt);
           return tokenString;
       }
2. 인증서버 토큰
static string GetServiceToken(string clientId, string clientSecret, string jwtToken)
       {
           // 토큰 요청을 위한 데이터 준비
           var requestData = new Dictionary<string, string>
           {
               { "grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer" },
               { "client_id", clientId },
               { "client_secret", clientSecret },
               { "assertion", jwtToken },
               { "scope", "bot user.read" }
           };
           var requestContent = new FormUrlEncodedContent(requestData);
           // 토큰 요청 보내기
           using (var httpClient = new HttpClient())
           {
               httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
               var response = httpClient.PostAsync("https://auth.worksmobile.com/oauth2/v2.0/token", requestContent).Result;
               if (response.IsSuccessStatusCode)
               {
                   var responseBody = response.Content.ReadAsStringAsync().Result;
                   Console.WriteLine(responseBody);
                   return responseBody;
               }
               else
               {
                   Console.WriteLine("Error: " + response.StatusCode);
                   return null;
               }
           }
       }

댓글3

  • 업데이트 된 답글입니다.

    commit

    코드에는 문제가 없는 것 같은데요.. JWT토큰만 따로 생성해서 postman에서 호출 해보았을 때 엑세스토큰이 발급되는지 확인 해보면 어떨까요

    2024.02.20

    0
  • 업데이트 된 답글입니다.

    TestGun 작성자

    postman으로 호출 시 Request scope is not valid 에러가 나타납니다.

    2024.02.21

    0
  • 업데이트 된 답글입니다.

    TestGun 작성자

    bot user.read -> bot 으로 변경 후 정상작동합니다.

    2024.02.21

    1
이전 글메시지 백업
다음 글Internal Server Error 확인 요청
목록

궁금한 점을 해결하지 못하셨나요?
지금 바로 NAVER WORKS 사용자들에게 물어보세요!