如果要在自己的系统中操作jira的api完成这些单据的创建、审批等操作,就不得不要先完成jira的第三方授权,才能在第三方系统去做这些jira的操作。
  1. 首先必须在jira系统配置客户端的相关信息,须配置几个指标:

    • 客户端访问地址需要先配置
    • Consumer key:客户端关键字(可自定义)
    • Consumer name:客户端名称(接入系统的名称)
    • Public key:公钥(自己生成公钥/私钥对)
    • Callback url:回调地址,用于jira验证登录成功之后回调到客户端系统,并传入准入令牌等信息,客户端再次请求获取access token,并将access token保存在客户端,后面再次请求jira的api就可以携带accesstoken进行请求
  2. 生成 RSA 公钥/私钥对

    在macos或者linux终端中,运行以下 openssl 命令。

    您可以在文件系统的任何位置执行此操作,但请注意,这是创建文件的位置。

生成 1024 位私钥:

openssl genrsa -out jira_privatekey.pem 1024

创建 X509 证书:

openssl req -newkey rsa:1024 -x509 -key jira_privatekey.pem -out jira_publickey.cer -days 365

将私钥(PKCS8格式)提取到 jira_privatekey.pcks8 文件中:

openssl pkcs8 -topk8 -nocrypt -in jira_privatekey.pem -out jira_privatekey.pcks8

将证书中的公钥提取到 jira_publickey.pem文件中:

openssl x509 -pubkey -noout -in jira_publickey.cer  > jira_publickey.pem
  • 最终将jira_privatekey.pcks8文件中的私钥字符串考出来,放在客户端程序。
  • 将jira_publickey.pem文件中的公钥字符串考出来,放在jira公钥配置的栏目。
  • 参考文档:Oauth授权流程
  1. 配置好jira的四个配置以后,来到客户端程序,需要在你的客户端系统中配置并保存好两个对应配置,后面需要基于此两个配置来发起授权请求:

    • consumerKey 客户端关键字(和jira配置的一致)
    • privateKey 私钥,上面生成的私钥/公钥对
  2. 客户端的后端程序提供接口,获取jira的登陆校验地址,此时后端程序中就需要用到consumerKey和privateKey两个参数,最终此后端接口返回一个授权登录的url给前端服务,由前端页面打开链接窗口。
  3. 在前端服务器页面打开的授权登录窗口中,输入jira登录密码,完成授权,此时之前配置在jira的回调地址,会把授权完成产生的oauth_token和oauth_verifier回调到客户端的后端接口程序。
  4. 客户端后端的回调方法再次根据获得的oauth_token和oauth_verifier,请求jira换取accesstoken令牌,获得令牌后并保存在服务端数据库。
  5. 完成此一系列操作后,最终此回调方法可以返回一个关闭窗口命令的字符串给前端,让前端关掉此前的授权窗口。
  6. 所有客户端后端服务需要接口有两个:

获取jira授权地址接口

@ApiOperation(value = "返回jira登录验证页面地址", notes = "返回jira登录验证页面地址", httpMethod = "GET")
@GetMapping(value = ["/jiraLogin"])
fun jiraLogin(): Map<String, String> {
// 请求jira认证
try {
return mapOf("redirectUrl" to jiraApiService.getAuthorizeUrl())
} catch (e: HttpResponseException) {
Log.get().error("""JIRA 登陆失败: ${e.message}""")
throw Exception("JIRA 登陆失败!!")
}
}

回调接口——在获取授权token和授权码之后调用回调函数换取accessToken

@ApiOperation(value = "jira回调地址完成授权,保存accesstoken", notes = "jira回调地址完成授权,保存accesstoken", httpMethod = "GET")
@GetMapping(value = ["/oauth"])
fun jiraLoginCallback(
@RequestParam(value = "oauth_token") requestToken: String,
@RequestParam(value = "oauth_verifier") secret: String,
request: HttpServletRequest,
response: HttpServletResponse
) {
try {
val token = jiraApiService.requestJiraAccessToken(requestToken, secret)
jiraApiService.saveAccessToken(token)
} catch (e: Exception) {
Log.get().error("JIRA认证失败: ${e.message}")
} finally {
response.addHeader("Content-Type", "text/html; charset=utf-8")
val out = response.writer
out.write("""<script language="javascript"> setTimeout("window.close()", 500); </script>""")
out.close()
}
}
  1. 流程参考地址:授权完整流程,可下载demo

最新文章

  1. 通过Redux源码学习基础概念一:简单例子入门
  2. offset图
  3. 简单的jquery tab
  4. CSS巧妙实现分隔线的几种方法
  5. HoverTree项目已经实现分层
  6. HL AsySocket 服务开发框架 - 总体思路与架构
  7. convert2Mp4 code snippet
  8. 破解 Splish
  9. poj 动态规划题目列表及总结
  10. 转: 数字证书原理 https 完整过程解析
  11. ThinkPHP3.2 加载过程(四)
  12. .NET MVC 依赖注入 来龙去脉
  13. 把本地建好的项目提交到git上
  14. Openjudge-NOI题库-和数
  15. HibernateTemplate实现查询distinct构造对象
  16. Android - TabHost 与 Fragment 制作页面切换效果
  17. DevOps教程
  18. Abp.NHibernate连接PostgreSQl数据库
  19. 事务的四大特性(ACID):
  20. JS版日期格式化和解析工具类,毫秒级

热门文章

  1. python——os模块学习
  2. 2022春每日一题:Day 15
  3. Revit2021保姆级安装教程
  4. Java-数组工具类Arrays
  5. c++ const和指针
  6. 【每日一题】【将cur的next尾插到pre后面,尾插k-1次】25. K 个一组翻转链表-211115&amp;220120
  7. Python数据类型+运算符
  8. python虚拟环境和venv的使用
  9. 学习Django框架之前所需要了解的知识点
  10. Python:界面开发,wx入门篇