Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

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 사용하는 방법"과 비교하면 확실히 절차가 간단해졌습니다. ^^




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

[연관 글]






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

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

비밀번호

댓글 작성자
 




... [31]  32  33  34  35  36  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12855정성태11/13/20216244개발 환경 구성: 605. Azure App Service - Kudu SSH 환경에서 FTP를 이용한 파일 전송
12854정성태11/13/20217797개발 환경 구성: 604. Azure - 윈도우 VM에서 FTP 여는 방법
12853정성태11/10/20216157오류 유형: 766. Azure App Service - JBoss 호스팅 생성 시 "This region has quota of 0 PremiumV3 instances for your subscription. Try selecting different region or SKU."
12851정성태11/1/20217550스크립트: 34. 파이썬 - MySQLdb 기본 예제 코드
12850정성태10/27/20218695오류 유형: 765. 우분투에서 pip install mysqlclient 실행 시 "OSError: mysql_config not found" 오류
12849정성태10/17/20217834스크립트: 33. JavaScript와 C#의 시간 변환 [1]
12848정성태10/17/20218810스크립트: 32. 파이썬 - sqlite3 기본 예제 코드 [1]
12847정성태10/14/20218657스크립트: 31. 파이썬 gunicorn - WORKER TIMEOUT 오류 발생
12846정성태10/7/20218413스크립트: 30. 파이썬 __debug__ 플래그 변수에 따른 코드 실행 제어
12845정성태10/6/20218239.NET Framework: 1120. C# - BufferBlock<T> 사용 예제 [5]파일 다운로드1
12844정성태10/3/20216245오류 유형: 764. MSI 설치 시 "... is accessible and not read-only." 오류 메시지
12843정성태10/3/20216691스크립트: 29. 파이썬 - fork 시 기존 클라이언트 소켓 및 스레드의 동작파일 다운로드1
12842정성태10/1/202125050오류 유형: 763. 파이썬 오류 - AttributeError: type object '...' has no attribute '...'
12841정성태10/1/20218518스크립트: 28. 모든 파이썬 프로세스에 올라오는 특별한 파일 - sitecustomize.py
12840정성태9/30/20218616.NET Framework: 1119. Entity Framework의 Join 사용 시 다중 칼럼에 대한 OR 조건 쿼리파일 다운로드1
12839정성태9/15/20219667.NET Framework: 1118. C# 11 - 제네릭 타입의 특성 적용파일 다운로드1
12838정성태9/13/20219314.NET Framework: 1117. C# - Task에 전달한 Action, Func 유형에 따라 달라지는 async/await 비동기 처리 [2]파일 다운로드1
12837정성태9/11/20218221VC++: 151. Golang - fmt.Errorf, errors.Is, errors.As 설명
12836정성태9/10/20217828Linux: 45. 리눅스 - 실행 중인 다른 프로그램의 출력을 확인하는 방법
12835정성태9/7/20219071.NET Framework: 1116. C# 10 - (15) CallerArgumentExpression 특성 추가 [2]파일 다운로드1
12834정성태9/7/20217463오류 유형: 762. Visual Studio 2019 Build Tools - 'C:\Program' is not recognized as an internal or external command, operable program or batch file.
12833정성태9/6/20216909VC++: 150. Golang - TCP client/server echo 예제 코드파일 다운로드1
12832정성태9/6/20217772VC++: 149. Golang - 인터페이스 포인터가 의미 있을까요?
12831정성태9/6/20216299VC++: 148. Golang - 채널에 따른 다중 작업 처리파일 다운로드1
12830정성태9/6/20218566오류 유형: 761. Internet Explorer에서 파일 다운로드 시 "Your current security settings do not allow this file to be downloaded." 오류
12829정성태9/5/202110205.NET Framework: 1115. C# 10 - (14) 구조체 타입에 기본 생성자 정의 가능파일 다운로드1
... [31]  32  33  34  35  36  37  38  39  40  41  42  43  44  45  ...