성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - JIRA REST API 사용 정리 (2) JIRA OAuth 토큰으로 API 사용하는 방법</h1> <p> 예전 글에서는 JIRA에 대해 Basic 인증을 사용했는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - JIRA REST API 사용 정리 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11566'>https://www.sysnet.pe.kr/2/0/11566</a> </pre> <br /> OAuth 인증을 사용하려면 어떻게 해야 할까요? 이를 위해 필요한 값은 다음의 4가지 값입니다.<br /> <br /> <ul> <li>Access Token</li> <li>Access Token Secret</li> <li>Consumer Key</li> <li>Consumer Secret</li> </ul> <br /> 문제는, 이 값들을 구하는 방법이 좀 어렵다는 점입니다. 가령 Github 등의 서비스들은 관리 화면에 가서 Access Token을 바로 구해 간편하게 사용할 수 있는데요, JIRA는 관리 화면에서 직접적으로 저 값들을 구하는 방식이 아닙니다.<br /> <br /> 여기서 Consumer Secret은 개인키이고, 그것의 공개키를 이용해 JIRA 서비스와 연동하며 남은 3가지 값을 구할 수 있는데요, 뭐랄까 마치 Linux 세계에서 SSH 통신을 위해 서버 측에 공개키를 보관해 두는 방식과 유사하면서 복잡도는 더 증가한 방식입니다.<br /> <br /> 어쨌든, 이에 대한 방법은 다음의 공식 문서에서 살펴볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Jira Server Developer - OAuth ; <a target='tab' href='https://developer.atlassian.com/server/jira/platform/oauth/'>https://developer.atlassian.com/server/jira/platform/oauth/</a> </pre> <br /> 문서를 따라 해 볼까요? ^^<br /> <br /> 우선, openssl 도구를 이용해 다음의 절차로 자신의 개인키/공개키를 만들어 둡니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > openssl genrsa -out jira_privatekey.pem 1024 openssl req -newkey rsa:1024 -x509 -key jira_privatekey.pem -out jira_publickey.cer -days 365 openssl pkcs8 -topk8 -nocrypt -in jira_privatekey.pem -out jira_privatekey.pkcs8 openssl x509 -pubkey -noout -in jira_publickey.cer > jira_publickey.pem </pre> <br /> 또는, 기존에 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11942'>ssh-keygen으로 만들어 둔 키</a>가 있다면 출력된 개인키 파일과 공개키 파일을 pem 형식으로 변환해 둡니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ssh-keygen으로 생성한 개인키/공개키 파일을 각각 PKCS8/PEM 형식으로 변환하는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12560'>https://www.sysnet.pe.kr/2/0/12560</a> </pre> <br /> <a name='app_link'></a><br /> 저렇게 개인키/공개키 파일을 구했으면 이제 JIRA에 로그인을 하고 Jira settings > Add-ons -> Application links로 들어가,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='jira_oauth_key_1.png' src='/SysWebRes/bbs/jira_oauth_key_1.png' /><br /> <br /> 위의 화면에서 "Application" 항목에 아무 URL 형식이나 입력하고 "Create new link" 버튼을 누릅니다. 그럼, 다음과 같은 경고와 함께 다시 한번 확인을 요하는 창이 뜨는데요,<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> No response was received from the URL you entered - it may not be valid. Please fix the URL below, if needed, and click Continue.<br /> </div><br /> <br /> 상관없습니다. 해당 URL은 실제로 JIRA 측에서 접속해야만 하는 외부 서비스인 경우에만 유효하고, 반대로 JIRA 측으로 접속해야 하는 경우에는 단순히 식별자 정도로 여기고 그냥 진행해도 됩니다.<br /> <br /> 그럼, 다시 아래와 같은 창을 띄우는데요,<br /> <br /> <img alt='jira_oauth_key_2.png' src='/SysWebRes/bbs/jira_oauth_key_2.png' /><br /> <br /> 아래의 3가지 설정만 하고 "Continue"를 누릅니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Application Name: mytest Application Type: Generic Application Create incoming link: (Checked) </pre> <br /> 이후 대화창에서는 다음과 같이 구성해 마무리를 하면 됩니다.<br /> <br /> <img alt='jira_oauth_key_3.png' src='/SysWebRes/bbs/jira_oauth_key_3.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Consumer key = (원하는 임의의 문자열: 이후의 작업에서 식별자로 사용) Consumer name = (원하는 임의의 문자열) Public key = ...[공개키 pem 파일의 내용]... 예) Consumer key = myOauthKey Consumer name = Example Jira app Public key = ...[공개키 pem 파일의 내용]... </pre> <br /> 그다음, 아래의 repo를 clone 해서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > git clone https://bitbucket.org/atlassianlabs/atlassian-oauth-examples.git </pre> <br /> .\atlassian-oauth-examples\java\src\main\java\com\atlassian\oauth\client\example\PropertiesClient.java 파일의 DEFAULT_PROPERTY_VALUES 코드를 다음과 같이 변경합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private final static Map<String, String> DEFAULT_PROPERTY_VALUES = ImmutableMap.<String, String>builder() <span style='color: blue; font-weight: bold'>.put(JIRA_HOME, "http://...jira 서비스 기본 주소...") .put(CONSUMER_KEY, "myOauthKey") // 이전 단계에서 등록했던 Consumer key .put(PRIVATE_KEY, "...[jira_privatekey.pcks8 파일의 내용 또는 ssh-keygen의 경우 개인키 파일 내용]...")</span> .build(); </pre> <br /> 이후 .\atlassian-oauth-examples\java 디렉터리에서 <a target='tab' href='https://maven.apache.org/download.cgi'>mvn</a>을 이용해 빌드해 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\atlassian-oauth-examples\java> <span style='color: blue; font-weight: bold'>mvn clean compile assembly:single</span> </pre> <br /> .\atlassian-oauth-examples\java\target 디렉터리에 OAuthTutorialClient-1.0.jar 파일이 생성되고, 이것을 실행해 새롭게 Token 정보를 요구할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\atlassian-oauth-examples\java> <span style='color: blue; font-weight: bold'>cd target</span> c:\temp\atlassian-oauth-examples\java\target> <span style='color: blue; font-weight: bold'>java -jar OAuthTutorialClient-1.0.jar requestToken</span> Creating default properties file: config.properties Token: U2cfGjfM6ELmU7iCw1j1iUJreWNfBZqB Token secret: 83sOm6FQ1AWhjv7JZL5WU93hQy48xLYG Retrieve request token. Go to <span style='color: blue; font-weight: bold'>http://...jira 서비스 기본 주소.../plugins/servlet/oauth/authorize?oauth_token=U2cf...[생략]...BZqB</span> to authorize it. </pre> <br /> 출력 정보에 따라, (10분 내에) "Go to http..."에 해당하는 URL을 방문해서 "Allow" 버튼을 눌러 줍니다. 그럼, 다음과 같은 식의 메시지가 출력됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Access Approved You have successfully authorized 'Example Jira app'. <span style='color: blue; font-weight: bold'>Your verification code is 'cSMF9F'</span>. You will need to enter this exact text when prompted. You should write this value down before closing the browser window. </pre> <br /> 그리고 위에서 출력된 "verification code"를 입력으로 다시 한번 다음의 명령어를 실행하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\atlassian-oauth-examples\java\target> <span style='color: blue; font-weight: bold'>java -jar OAuthTutorialClient-1.0.jar accessToken cSMF9F</span> Access token: m88BvFRz7AQ0HoY42r3qeDV0iHfsP82a </pre> <br /> 이제서야 Access token 값을 얻게 됩니다. 그리고, 위와 같은 정보들은 OAuthTutorialClient-1.0.jar 파일이 있는 디렉터리에 config.properties로도 저장되어 있으니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\atlassian-oauth-examples\java\target> <span style='color: blue; font-weight: bold'>type config.properties</span> #Thu Mar 11 19:36:38 KST 2021 <span style='color: blue; font-weight: bold'>consumer_key=myOauthKey access_token=m88BvFRz7AQ0HoY42r3qeDV0iHfsP82a</span> request_token=U2cfGjfM6ELmU7iCw1j1iUJreWNfBZqB <span style='color: blue; font-weight: bold'>jira_home=http\://...jira 서비스 기본 주소...</span> <span style='color: blue; font-weight: bold'>private_key=MIICeAIBADA...[생략]...tw2r33z</span> <span style='color: blue; font-weight: bold'>secret=cSMF9F</span> </pre> <br /> 이후 필요할때 저 파일을 참고하시면 됩니다. 실제로 저 설정으로 OAuth 인증이 잘 동작하는지, 다음과 같이 request를 날리고 그 응답이 잘 오는지 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\atlassian-oauth-examples\java\target> <span style='color: blue; font-weight: bold'>java -jar OAuthTutorialClient-1.0.jar request http://...jira 서비스 기본 주소.../rest/api/2/issue/...issue_number...</span> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 이렇게 발행한 Access token은 JIRA의 사용자 프로파일 정보로 들어가,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='jira_oauth_key_4.png' src='/SysWebRes/bbs/jira_oauth_key_4.png' /><br /> <br /> Tools / "View OAuth Access Tokens" 메뉴로,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='jira_oauth_key_5.png' src='/SysWebRes/bbs/jira_oauth_key_5.png' /><br /> <br /> 다음과 같이 확인할 수 있고 "Revoke Access"를 통해 사용을 해제하는 것도 가능합니다.<br /> <br /> <img alt='jira_oauth_key_6.png' src='/SysWebRes/bbs/jira_oauth_key_6.png' /><br /> <br /> (참고로, 저 메뉴에 "View OAuth Access Tokens"가 있길래 처음에는 어딘가 Access Tokens를 쉽게 만들 수 있는 메뉴가 있지 않을까 싶어 헤매며 돌아다녔는데 결국 생성 메뉴는 애당초 없었던 것입니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 자, 그럼 이제 이것을 가지고 (최소 .NET 4.5.2 이상의) .NET 클라이언트에서 어떻게 사용하는지 보겠습니다. 이에 대해서는 다음의 글에서 방법을 찾을 수 있는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Connect to Jira with a Private Key (OAuth) using .NET ; <a target='tab' href='https://keestalkstech.com/2019/06/connect-to-jira-with-a-private-key-using-net/'>https://keestalkstech.com/2019/06/connect-to-jira-with-a-private-key-using-net/</a> </pre> <br /> 현재 OAuth 인증을 위해 Access Token, Access Token Secret, Consumer Key 3가지 값은 구한 상태이고 이제 4번째 값을 구하는데 이를 위해 필요한 패키지가 OpenSSL.PrivateKeyDecoder입니다. 이것은 PKCS8 포맷의 개인키로부터 Consumer Secret에 사용할 수 있는 값으로 변환할 수 있는데요, 간단하게 .NET 5 console 프로젝트를 만들어 패키지 참조 추가 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Install-Package <a target='tab' href='https://www.nuget.org/packages/OpenSSL.PrivateKeyDecoder/'>OpenSSL.PrivateKeyDecoder</a> </pre> <br /> 다음과 같이 코드를 작성할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; class Program { static void Main(string[] args) { var privateKey = "-----BEGIN PRIVATE KEY-----MIICeA...[생략]...w2r33z-----END PRIVATE KEY-----"; // <- get your private key in here <span style='color: blue; font-weight: bold'>var decoder = new OpenSSL.PrivateKeyDecoder.OpenSSLPrivateKeyDecoder(); var keyInfo = decoder.Decode(privateKey); var consumerSecret = OpenSSL.PrivateKeyDecoder.RSAExtensions.ToXmlString(keyInfo, true);</span> Console.WriteLine(consumerSecret); } } /* 출력 결과 <RSAKeyValue><Modulus>z849b+...[생략]...U02BE=</D></RSAKeyValue> */ </pre> <br /> 이제 저 값만 복사해 두고 (또는 매번 저 코드를 실행해 consumerSecret을 구해) "Atlassian.SDK" 패키지를 참조 추가한,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Install-Package Atlassian.SDK </pre> <br /> C# 프로젝트에서 JIRA REST API를 OAuth 인증을 통해 호출할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; namespace ConsoleApp1 { class Program { static async Task Main(string[] args) { var consumerSecret = "<RSAKeyValue><Modulus>z849b+...[생략]...U02BE=</D></RSAKeyValue>"; string consumerKey = "myOauthKey"; // config.properties 파일의 consumer_key 값 string accessToken = "m88BvFRz7AQ0HoY42r3qeDV0iHfsP82a"; // config.properties 파일의 access_token 값 string accessTokenSecret = "cSMF9F"; // config.properties 파일의 secret 값 <span style='color: blue; font-weight: bold'>var client = Atlassian.Jira.Jira.CreateOAuthRestClient("http://...jira 서비스 기본 주소...", consumerKey, consumerSecret, accessToken, accessTokenSecret ); var issue = await client.Issues.GetIssueAsync("...issue_number...");</span> Console.WriteLine(issue.Summary); } } } </pre> <br /> (참고로, 저렇게 개인키를 응용 프로그램에 포함시켜 배포하기 때문에 중요하게 사용하는 개인키를 재사용해서는 안 됩니다. 즉, 저것은 단일 응용 프로그램에만 사용하는 용도의 RSA 키를 만들어서 사용하는 것이 바람직합니다.)<br /> <br /> 여기까지 아주 복잡하게 OAuth 인증 테스트를 해봤는데요, 일단 이 글에서 설명한 방식은 "<a target='tab' href='https://developer.atlassian.com/server/jira/platform/oauth/'>Jira Server Developer - OAuth</a>" 문서를 기반으로 했기에 복잡한 것이지, 현재는 더 좋은 접근 방식이 .NET 도구로 제공되므로 이 글의 내용보다는 쉽게 OAuth 키 구성을 할 수 있습니다. 이에 대해서는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12563'>다음에 ^^ 자세하게 설명</a>하겠습니다.<br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1737&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 개인키를 변환해 consumerSecret을 구하는 OpenSSL.PrivateKeyDecoder는 요구 사항이 .NET Standard 1.3이므로 .NET Framework 프로젝트의 경우 최소 4.6 대상으로 만들어야 한다는 건데요, 하지만 실제로 해보면 OpenSSL.PrivateKeyDecoder.RSAExtensions을 사용하는 코드에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var consumerSecret = OpenSSL.PrivateKeyDecoder.RSAExtensions.ToXmlString(keyInfo, true); </pre> <br /> RSAExtensions 타입이 없어 컴파일 에러가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > error CS0234: The type or namespace name 'RSAExtensions' does not exist in the namespace 'OpenSSL.PrivateKeyDecoder' (are you missing an assembly reference?) </pre> <br /> OpenSSL.PrivateKeyDecoder 패키지는 .NET Framework에 대해 (4.8까지도) RSAExtensions 타입은 제공하지 않는 듯합니다. 따라서, 어쩔 수 없이 consumerSecret을 구하는 것은 .NET 5 프로젝트로 만들어 구해둔 다음 그 문자열을 복사해와서 .NET Framework 프로젝트에서 사용하는 식으로 해야 합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 만약 OpenSSLPrivateKeyDecoder.Decode 메서드 호출 시 다음과 같은 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unhandled exception. System.NotSupportedException: Specified method is not supported. at OpenSSL.PrivateKeyDecoder.OpenSSLPrivateKeyDecoder.DecodeParameters(String privateText, SecureString password) at OpenSSL.PrivateKeyDecoder.OpenSSLPrivateKeyDecoder.Decode(String privateText, SecureString password) at ConsoleApp1.Program.Main(String[] args) in c:\temp\jira_oauth\ConsoleApp1\ConsoleApp1\Program.cs:line 14 </pre> <br /> 개인키 문자열을 이런 식으로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var privateKey = "MIICe..[생략]...gAtw2r33z"; </pre> <br /> 잘못 전달해서 그런 것입니다. 반드시 "BEGIN PRIVATE KEY" / "END PRIVATE KEY" 쌍으로 감싸야만 정상적으로 동작합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var privateKey = "-----BEGIN PRIVATE KEY-----MIICe..[생략]...gAtw2r33z-----END PRIVATE KEY-----"; </pre> <br /> <hr style='width: 50%' /><br /> <br /> 만약 Atlassian.Jira.Jira 개체로 REST API 호출이 발생했을 때 다음과 같은 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unhandled exception. System.ApplicationException: Using query parameters in the base URL is not supported for OAuth calls. Consider using AddDefaultQueryParameter instead. at RestSharp.Authenticators.OAuth1Authenticator.AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflow workflow) at RestSharp.Authenticators.OAuth1Authenticator.Authenticate(IRestClient client, IRestRequest request) at RestSharp.RestClient.AuthenticateIfNeeded(IRestRequest request) at RestSharp.RestClient.ExecuteAsync(IRestRequest request, Action`2 callback, String httpMethod, Func`4 getWebRequest) at RestSharp.RestClient.ExecuteAsync(IRestRequest request, Action`2 callback, Method httpMethod) at RestSharp.RestClient.ExecuteAsync(IRestRequest request, Action`2 callback) at RestSharp.RestClient.ExecuteAsync(IRestRequest request, CancellationToken token) --- End of stack trace from previous location --- at Atlassian.Jira.Remote.JiraRestClient.ExecuteRequestAsync(Method method, String resource, Object requestBody, CancellationToken token) at Atlassian.Jira.Remote.IssueService.GetIssueAsync(String issueKey, CancellationToken token) at ConsoleApp1.Program.TestCode() in c:\temp\jira_oauth\ConsoleApp1\ConsoleApp1\Program.cs:line 61 at ConsoleApp1.Program.Main(String[] args) in c:\temp\jira_oauth\ConsoleApp1\ConsoleApp1\Program.cs:line 14 at ConsoleApp1.Program.<Main>(String[] args) </pre> <br /> 아마도 "<a target='tab' href='https://keestalkstech.com/2019/06/connect-to-jira-with-a-private-key-using-net/'>Connect to Jira with a Private Key (OAuth) using .NET</a>" 문서의 내용을 따라 Jira 개체를 다음과 같은 식으로 초기화한 것일 텐데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var client = Atlassian.Jira.Jira.CreateRestClient("http://...jira 서비스 기본 주소..."); client.RestClient.RestSharpClient.Authenticator = RestSharp.Authenticators.OAuth1Authenticator.ForProtectedResource( consumerKey, consumerSecret, accessToken, accessTokenSecret, RestSharp.Authenticators.OAuth.OAuthSignatureMethod.RsaSha1 ); </pre> <br /> 정확한 원인은 알 수 없지만, Authenticator를 저렇게 Jira 인스턴스가 생성된 이후 초기화하면 (저 글을 쓰는 당시에는 가능했겠지만 현재는) 정상적으로 구성이 되지 않는 듯합니다. 따라서, 명시적으로 Authenticator 설정과 함께 개체 초기화를 수행하는 생성자를 사용하는 것으로 바꿔야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var client = Atlassian.Jira.Jira.CreateOAuthRestClient("http://...jira 서비스 기본 주소...", consumerKey, consumerSecret, accessToken, accessTokenSecret ); </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1370
(왼쪽의 숫자를 입력해야 합니다.)