Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

C# - JIRA REST API 사용 정리 (3) jira-oauth-cli 도구를 이용한 키 관리

JIRA에 대한 REST API 호출을 OAuth 인증으로 다루는 방법을 설명했는데요,

C# - JIRA REST API 사용 정리 (2) JIRA OAuth 토큰으로 API 사용하는 방법
; https://www.sysnet.pe.kr/2/0/12562

다행히 저 글에서 설명한 token 생성은 현재 jira-oauth-cli 도구 덕분에 쉽게 처리할 수 있게 되었습니다. 이에 대해서는 다음의 문서에서 자세하게 설명하고 있는데요,

How to Connect to Jira using OAuth
; https://bitbucket.org/farmas/atlassian.net-sdk/src/e51934c33c796ba9b4c83bac75f740ed4d04bc2f/docs/how-to-connect-using-oauth.md

얼마나 쉬운지 직접 따라 해볼까요? ^^

우선, 다음과 같이 jira-oauth-cli 도구를 설치하고,

c:\temp> dotnet tool install -g jira-oauth-cli

다음의 명령어로 Access Token 생성을 진행할 수 있습니다.

jira-oauth-cli setup --url <jira_url> -u <jira_user> -p <jira_password> -k <consumer_key>

jira_user: JIRA 로그인 계정
jira_password: jira_user의 암호
consumer_key: 임의의 문자열

예를 들어 다음과 같은 식으로 입력해 진행하면 됩니다.

/*
계정: testusr
암호: qwer
consumer_key: OauthKey
JIRA 서비스 주소: http://jira.myservice.com
*/

c:\temp> jira-oauth-cli setup --url http://jira.myservice.com -u testusr -p qwer -k OauthKey

그럼 실행과 함께 자체적으로 개인키/공개키를 만들고 JIRA에 OAuth Access Token을 구하기 위한 절차를 다음과 같이 진행합니다.

c:\temp> jira-oauth-cli setup --url http://jira.myservice.com -u testusr -p qwer -k OauthKey
Create an App Link

Go to https://developer.atlassian.com/server/jira/platform/oauth and follow instructions with the data below:
Your Consumer Key is: OauthKey
Your Public Key is:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArAHIZSmty3jd8dHH2Rjz
yw//qrbPQQuulD39j9uVXd1WywXjw7ljtf8vmXqLAcEytBtPEU37DQxpYVKof97g
oYFSTN16Bq1EUQWmY31lRQ72iKeXIwR3K2FbLPKDKg02K5c6hh5s1GX3b4XlJEja
PmhQzbbUM5RRYnf1hERGw1vE7kfrJxfBv8PyBFeehmhrIa5XU1SR2bBhgRV1ZXzt
Ap+ykuCfnub3sxMnz4kZqhb/+q9qq34txwlnOdn9ibQQnNMugVuZ7GoINzggdtzu
8gWi9JGPGl53O2eC5CDoDc3q0fjdKp/+Q8gx+J00ZhW4Z4uLXYczr1P3DhBocxL8
8QIDAQAB
-----END PUBLIC KEY-----

Hit 'Enter' when you are done configuring the AppLink.

"jira-oauth-cli setup ..." 명령어의 실행 결과로 출력된 "https://developer.atlassian.com/server/jira/platform/oauth" 링크가 바로 지난 글에서 키를 생성하기 위해 따라 했던 과정을 설명하는 문서입니다. 즉, 위의 명령어는 그 글에서 설명하는 방법에 따라 OAuth 인증을 위한 액세스 토큰을 생성하려는 것이고, 편의상 (아직 출력하지는 않았지만 개인키와 함께) "Public Key"를 임의로 만들었으니 그것을 가지고 AppLink를 생성하면 됩니다. 그 방법은 지난 글에서 "Application links"로 이미 설명했으니 그 내용을 참고하시면 됩니다.

그렇게 해서 "OauthKey"에 해당하는 Application Link를 JIRA에 로그인해 생성해 두었으면 이제 "Enter" 키를 눌러 다음 단계로 진행합니다. 그럼 화면에 다음과 같은 출력이 이어지고,

Generating Request Token

Authorizing token 'http://jira.myservice.com/plugins/servlet/oauth/authorize?oauth_token=c8mJdcIpNACsBz9LvUOf91XjaDoy9Zb0'

Unable to automatically authorise token, please visit 'http://jira.myservice.com/plugins/servlet/oauth/authorize?oauth_token=c8mJdcIpNACsBz9LvUOf91XjaDoy9Zb0' in a browser.
Hit 'Enter' when you are done authorizing the token.

화면에 보이는 "Authorizing token 'http://..." 링크를 직접 방문해 지난 글에서와 마찬가지로 "Allow" 버튼을 눌러 승인을 해줍니다. 그럼 웹브라우저에는 다음과 같이 성공했다는 메시지가 뜨고,

Access Approved
You have successfully authorized 'Example Jira app'. Please close this browser window and click continue in the client.

이것을 확인했으면 진행 중이던 "jira-oauth-cli setup ..." 콘솔 창에서 "Enter" 키를 눌러줍니다. 그럼, 마지막으로 화면에는 OAuth 인증을 위한 Access Token 정보를 (개인키 정보를 담은 "Consumer Secret" 필드와 함께) 출력하는 것으로 작업이 마무리됩니다.

Generating Access Token

Consumer Key: OauthKey
Access Token: ei60qdMw7jBoOi5G44thD5jLJ3KzTelE
Token Secret: T8qah2TYIqHZXLvFBYv4mRlIx9eye6Fm
Consumer Secret:
<RSAKeyValue><Modulus>rAHIZSmty3jd8dHH2Rjzyw//qrbPQQuulD39j9uVXd1WywXjw7ljtf8vmXqLAcEytBtPEU37DQxpYVKof97goYFSTN16Bq1EUQWmY31lRQ72iKeXIwR3K2FbLPKDKg02K5c6hh5s1GX3b4XlJEjaPmhQzbbUM5RRYnf1hERGw1vE7kfrJxfBv8PyBFeehmhrIa5XU1SR2bBhgRV1ZXztAp+ykuCfnub3sxMnz4kZqhb/+q9qq34txwlnOdn9ibQQnNMugVuZ7GoINzggdtzu8gWi9JGPGl53O2eC5CDoDc3q0fjdKp/+Q8gx+J00ZhW4Z4uLXYczr1P3DhBocxL88Q==</Modulus><Exponent>AQAB</Exponent><P>1g6MRFnKO2OT48JG2dbb02Xlj2yzBBa7edDrsjLtem8dhqeCcXEZfCwOFfx4IpxMsLs80PuCRx+ECoq5qYDi+72piH2Er0zturVk6tp7eoQzo5IFKRflc3odt48vNJZoC9jzjeFEoOf4e3E1pW97IaqyiLWW6yGBlY5p75UlL+c=</P><Q>zbXxUzCoaISXPWuBuYluMtx8CybGKEIOByXpwusvL/d5O9C69mcck4NzeLsvVVJJXXnsM3bDENHUtQOE1zAhsBrhVeBrRrggqB1IdQNgfOdqi3ueo+NrSxuaCkQ5h4jPska3Lll2PA4M4CywUWpO2O5rVlh3WzNI3UpcmSVSsWc=</Q><DP>MhSjQpaTVwO8JQxeETdQpQvxAnZXB7zdzelQS5fYsc1vZgKo5Sul38Ra40/3N3nEA5E68FX3q/Y2qVS9jWfHM0izcmiTc4QXFpi77KqDOy3U+w79wBiEKVlHvJt2WuJZo3P1v5sVuGOtYgwhlfwYHc9XB98cWRS0wa3ZISGO2r8=</DP><DQ>P6SuyQIg2FVNRV9hfzmZsnqslfalEAd/t45vSDLjIn/6Lhth/KHiIXFl5FBlUIxozlbOUQ3JRAbnPCmei8UEZyup05vfFL4avGhy5mDpFTuzpvvUFPhjVZVwjwSUl+4n9AwU2G4tOl9OdHzfABFX253H76rnInw3at96zpbRgrk=</DQ><InverseQ>jPOVHue9abYFo9+QVA0bsPLbWCMrrsprLUdZpPkjgGip4spMZr8HJFXzPPLiUPNGvIoIPKHF9/Um64XjKdWdjYt6zBlX/x935VPbU8eQ+EoI4R39WFsDvuOKxuWxaDjTwceIiR+TpH8vniLJPe4oE5+HEeVKcxerpVtB9ChyHBM=</InverseQ><D>KP7zyEi6x3gzTeN2AmRUFt3lTcbsdtBV97cerB7l5s1OVm087/VLsqDzs1zlrLFjaFHp8nHnmCCRLUUKLA/u8g9kkjVnVBgP5E+4bJYCgQcj80YeW5ZA4PH/TSMv5+HmO1V7+WNfBPCYnNgI2TET8zPhrmYZBYIgM5vrxG6RfxYIOXGjo/4msrAVdk35lkhAOoiLpB6ifqqIcer3JgvnVFE9CNxF+vFHGzKkjnCUn6AH/9AcpR7KuHe2Psx8YRjMp4ukrgyFsCrDrMb1SIJWfI5DrZKVZdlbXQIaveVncyIP3R+J8iNmYKZDeLOb08hpoL27B+YGjEGiZSEKVXGCkQ==</D></RSAKeyValue>

자, 복잡했던 OAuth 토큰 생성 작업이 이렇게나 간단하게 해결이 되었습니다. 이제 남은 것은 위의 출력 정보를 바탕으로 Atlassian.SDK 패키지를 참조 추가한 프로젝트에서,

Install-Package Atlassian.SDK

각각의 값을 초기화한 후 REST API를 호출하면 됩니다.

static async Task Main(string[] args)
{
    var consumerSecret = "<RSAKeyValue>...[생략]...</RSAKeyValue>";
    string consumerKey = "OauthKey";
    string accessToken = "ei60qdMw7jBoOi5G44thD5jLJ3KzTelE";
    string accessTokenSecret = "T8qah2TYIqHZXLvFBYv4mRlIx9eye6Fm";

    var client = Atlassian.Jira.Jira.CreateOAuthRestClient("http://jira.myservice.com",
            consumerKey,      
            consumerSecret,   
            accessToken,      
            accessTokenSecret 
        );

    var issue = await client.Issues.GetIssueAsync("MYPRJ-100");

    Console.WriteLine(issue.Summary);
}

우와~~~ jira-oauth-cli 도구 덕분에 "C# - JIRA REST API 사용 정리 (2) JIRA OAuth 토큰으로 API 사용하는 방법"과 비교하면 확실히 절차가 간단해졌습니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]


donaricano-btn



[최초 등록일: ]
[최종 수정일: 3/17/2021 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 쓴 사람
 




1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
12629정성태5/5/2021270.NET Framework: 1057. C# - CoAP 서버 및 클라이언트 제작 (UDP 소켓 통신)파일 다운로드1
12628정성태5/4/2021137Linux: 39. Eclipse 원격 디버깅 - Cannot run program "gdb": Launching failed
12627정성태5/4/2021177Linux: 38. 라즈베리 파이 제로 용 프로그램 개발을 위한 Eclipse C/C++ 윈도우 환경 설정
12626정성태5/14/2021221.NET Framework: 1056. C# - Thread.Suspend 호출 시 응용 프로그램 hang 현상 (2)파일 다운로드1
12625정성태5/3/2021193오류 유형: 714. error CS5001: Program does not contain a static 'Main' method suitable for an entry point
12624정성태5/3/2021357.NET Framework: 1055. C# - struct/class가 스택/힙에 할당되는 사례 정리 [6]파일 다운로드1
12623정성태5/2/2021199.NET Framework: 1054. C# 9 최상위 문에 STAThread 사용파일 다운로드1
12622정성태5/3/2021100오류 유형: 713. XSD 파일을 포함한 프로젝트 - The type or namespace name 'TypedTableBase<>' does not exist in the namespace 'System.Data'
12621정성태5/1/2021296.NET Framework: 1053. C# - 특정 레지스트리 변경 시 알림을 받는 방법파일 다운로드1
12620정성태5/3/2021524.NET Framework: 1052. C# - 왜 구조체는 16 바이트의 크기가 적합한가? [1]파일 다운로드1
12619정성태4/29/2021467.NET Framework: 1051. C# - 구조체의 크기가 16바이트가 넘어가면 힙에 할당된다? [1]파일 다운로드1
12618정성태5/14/2021193사물인터넷: 58. NodeMCU v1 ESP8266 CP2102 Module을 이용한 WiFi UDP 통신파일 다운로드1
12617정성태4/26/2021167.NET Framework: 1050. C# - ETW EventListener의 Keywords 별 EventId에 따른 필터링 방법파일 다운로드1
12616정성태4/26/2021166.NET Framework: 1049. C# - ETW EventListener를 상속받았을 때 초기화 순서파일 다운로드1
12615정성태4/26/2021103오류 유형: 712. Microsoft Live 로그인 - 계정을 선택하는(Pick an account) 화면에서 진행이 안 되는 문제
12614정성태4/24/2021248개발 환경 구성: 570. C# - Azure AD 인증을 지원하는 ASP.NET Core 5.0 웹 애플리케이션 예제 구성 [2]파일 다운로드1
12613정성태4/23/2021164.NET Framework: 1048. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (2) 관리 코드파일 다운로드1
12612정성태4/23/2021166.NET Framework: 1047. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (1) PInvoke파일 다운로드1
12611정성태4/22/2021190오류 유형: 711. 닷넷 EXE 실행 오류 - Mixed mode assembly is build against version 'v2.0.50727' of the runtime
12610정성태4/22/2021260.NET Framework: 1046. C# - 컴파일 시점에 참조할 수 없는 타입을 포함한 이벤트 핸들러를 Reflection을 이용해 구독하는 방법파일 다운로드1
12609정성태4/22/2021297.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법파일 다운로드1
12608정성태4/22/2021463.NET Framework: 1044. C# - Generic Host를 이용해 .NET 5로 리눅스 daemon 프로그램 만드는 방법 [7]파일 다운로드1
12607정성태4/21/2021242.NET Framework: 1043. C# - 실행 시점에 동적으로 Delegate 타입을 만드는 방법파일 다운로드1
12606정성태4/21/2021327.NET Framework: 1042. C# - enum 값을 int로 암시적(implicit) 형변환하는 방법? [2]파일 다운로드1
12605정성태4/18/2021193.NET Framework: 1041. C# - AssemblyID, ModuleID를 관리 코드에서 구하는 방법파일 다운로드1
12604정성태4/19/2021222VS.NET IDE: 163. 비주얼 스튜디오 속성 창의 "Build(빌드)" / "Configuration(구성)"에서의 "활성" 의미
1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...