当前位置: 首页 > article >正文

使用python调用JIRA6 进行OAuth1认证获取AccessToken

Jira配置应用程序链接

1) 创建应用程序链接

  1. 登录 JIRA 管理后台。
  2. 转到 Administration > Applications > Application Links
  3. 在输入框中输入外部应用程序的 URL(例如 GitLab 或自定义应用),然后点击 Create new link

2) 配置 Consumer Key 和 Public Key

  1. 在创建应用链接的过程中:

    • Consumer Key:自定义一个唯一的字符串标识应用程序(例如 jira-oauth-client)。
    • Public Key:需要将客户端的公钥粘贴到这里(私钥用于客户端请求使用)。
  2. 公钥的格式应为 PEM 格式,示例如下:

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnVOGkhN0P3y+5FNceXGy
    q+YBl9cJpOyYsGnO94RtuOCmj/KFszDvn/dNqg2KjGvB5MgkHslZ8ZfZkXHZwIfB
    <...省略其余内容...>
    -----END PUBLIC KEY-----

3) 保存配置

  • 确保填写的 Consumer KeyPublic Key 在客户端代码中保持一致。
  • 保存链接。

提示:在Jira中配置应用程序链接的【链入认证】时没有配置客户回调URL,只配置了客户关键字(consumer_key),RSA加密公钥(public_key)

在 JIRA 中配置 应用程序链接(Application Link) 时,如果没有 consumer_secret 值,这其实是正常的情况。JIRA 的 OAuth 1.0a 认证机制只需要配置 Consumer KeyPublic Key

JIRA OAuth1为什么没有 consumer_secret

  • OAuth 1.0a 认证:

    • 在 JIRA 的 OAuth 1.0a 实现中,consumer_secret 并不是必需的部分。
    • JIRA 使用 Consumer Key 来标识应用程序,并通过 Public Key 验证签名。
  • 与其他 OAuth 1.0a 实现不同,JIRA 中的密钥对是基于 RSA 的公钥加密系统:

    • Public Key 配置在 JIRA 中。
    • Private Key 保存在客户端,并用于签名请求。

python代码示例

import requests
from requests_oauthlib import OAuth1Session

# 这些值来自你在 JIRA 上创建的 OAuth 应用
# 替换为你的 Consumer Key
consumer_key = 'your-consumer-key'
# 替换为你的 Consumer Secret,我在调用调用jira接口认证时,在jira中配置程序链接时,没有地方配置这个secret,因此这里可以空着不用,生成OAuth1Session对象时也不传这个参数即可,通过consumer_key判断请求客户端
consumer_secret = 'your-consumer-secret'

# 私钥,对应的公钥是配置在JIRA中的
PRIVATE_KEY = """
-----BEGIN RSA PRIVATE KEY-----
<your_private_key_here>
-----END RSA PRIVATE KEY-----
"""

# 替换为你的 JIRA 实例 URL
jira_url = 'https://your-jira-instance.atlassian.net'

# 请求 OAuth Token 的 URL
request_token_url = f'{jira_url}/plugins/servlet/oauth/request-token'
authorize_url = f'{jira_url}/plugins/servlet/oauth/authorize'
access_token_url = f'{jira_url}/plugins/servlet/oauth/access-token'

# 步骤 1: 获取请求令牌(Request Token)
oauth = OAuth1Session(client_key=consumer_key, rsa_key=private_key,signature_method="RSA-SHA1",callback_uri="oob")


# 获取请求令牌和请求令牌的 URL
request_token_response = oauth.fetch_request_token(request_token_url)

# 解析返回的令牌信息
request_token = request_token_response.get('oauth_token')
request_token_secret = request_token_response.get('oauth_token_secret')

print(f'Request Token: {request_token}')
print(f'Request Token Secret: {request_token_secret}')

# 步骤 2: 用户授权
print(f'Go to the following URL to authorize the application: {authorize_url}?oauth_token={request_token}')
# 确保用户输入授权码
oauth_verifier = input('Enter the verification code (oauth_verifier): ')  

# 步骤 3: 使用授权的 Token 获取访问令牌(Access Token)
# 传递 `verifier` 参数
oauth_tokens = oauth.fetch_access_token(access_token_url, verifier=oauth_verifier)  

access_token = oauth_tokens.get('oauth_token')
access_token_secret = oauth_tokens.get('oauth_token_secret')

print(f'Access Token: {access_token}')
print(f'Access Token Secret: {access_token_secret}')

遇到的问题

生成的JIRA授权URL没有verification code

点击程序生成的授权链接,然后点击allow按钮后,页面跳转后显示的信息如下:

You have successfully authorised 'xxxx'. Please close this browser window and click continue in the client.

这个信息里没有verification code,跟之前用java程序生成的授权URL得到的信息不一样,正确的信息应如下

You have successfully authorised 'xxxx'. Your verification code is 'GPmbXd'. You will need to enter this exact text when prompted. You should write this value down before closing the browser window.

通过对比原来的java程序和新写的python程序,发现原来的java在获取request token中,会设置callback = "oob"

JiraOAuthGetTemporaryToken oauthGetTemporaryToken = new JiraOAuthGetTemporaryToken(reuqestTokenUrl);

// 设置RSA验签私钥
OAuthRsaSigner oauthRsaSigner = new OAuthRsaSigner();
oauthRsaSigner.privateKey = xxxxx
oauthGetTemporaryToken.consumerKey = xxx
oauthGetTemporaryToken.signer = oauthRsaSigner;

oauthGetTemporaryToken.transport = new ApacheHttpTransport();
//设置回调为oob
oauthGetTemporaryToken.callback="oob";

我们看下1.0和1.0a协议的一些要求

  1. 1.0协议中callback在oauth认证的第二步(请求用户授权)中通过url参数设置并明文传输。新的1.0a协议中,callback作为oauth第一步(获取request token)的参数(oauth_callback),并参与到签名过程。此外当没有callback时,callback值必须设为oob(out-of-bound)。
  2. Provider在返回request token的同时,返回一个oauth_callback_confirmed参数,其值为true,表示Provider支持1.0a协议。
  3. 用户完成授权后,Provider在redirect到callback时,提供一个新的oauth_verifier参数(无法被猜测的随机字串),该参数会被用在request token换取access token的过程中。如果callback值为oob,那么Provider需要提供页面显示oauth_verifier参数值。而Consumer可以引导用户将这个参数值填入适当位置,来完成授权

requests_oauthlib.oauth1_session.VerifierMissing: No client verifier has been set.

这个问题处理起来就比较简单了,通过调试程序看到verification_code也的确传到fetch_access_token方法参数中了,但是还是说没有设置verifier,然后进入到oauth1_session.py代码中调试,发现其对verifier的判断逻辑如下

if verifier:
  self._client.client.verifier = verifier
if not getattr(self._client.client,"verifier",None):
  raise VerifierMissing("No client verifier has been set.")
token = self._fetch_token(url,**request_kwargs)

发现是参数名写的不对,之前代码中参数设置是

oauth_tokens = oauth.fetch_access_token(access_token_url, oauth_verifier=oauth_verifier)

修改后参数设置是

oauth_tokens = oauth.fetch_access_token(access_token_url, verifier=oauth_verifier)

参考 

OAuth协议更新到1.0a


http://www.kler.cn/a/517731.html

相关文章:

  • PyCharm接入DeepSeek实现AI编程
  • 数据的秘密:如何用大数据分析挖掘商业价值
  • 深度解析:基于Vue 3与Element Plus的学校管理系统技术实现
  • 硬件学习笔记--35 AD23的使用常规操作
  • ray.rllib-入门实践-12:自定义policy
  • CVE-2025-0411 7-zip 漏洞复现
  • 【u8g2模拟仿真】windows环境下使用sdl模拟仿真u8g2图形库
  • Ubuntu 顶部状态栏 配置,gnu扩展程序
  • FS飞速创新内推~
  • Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴
  • 【MySQL】我在广州学Mysql 系列——MySQL用户管理详解
  • SpringBoot Test详解
  • MySQL离线安装文档(Linux版)
  • 探索 SolidJS:一款高速的前端框架
  • 二叉树(了解)c++
  • Microsoft Edge 企业策略禁用更新
  • 【设计模式】访问者模式(Visitor Pattern): visitor.visit(), accept()
  • RocketMQ 系列文章
  • 【读书笔记·VLSI电路设计方法解密】问题43:什么是TestBench
  • python http调用视觉模型moondream
  • 配电自动化中的进线监控技术
  • 第十五届蓝桥杯大赛软件赛省赛Java 大学 B 组(1、2题)
  • git Bash通过SSH key 登录github的详细步骤
  • 微服务学习-负载均衡器 LoadBalancer 实战
  • QT QTableWidget控件 全面详解
  • 【阿里云】使用docker安装nginx后可以直接访问