使用python调用JIRA6 进行OAuth1认证获取AccessToken
Jira配置应用程序链接
1) 创建应用程序链接
- 登录 JIRA 管理后台。
- 转到 Administration > Applications > Application Links。
- 在输入框中输入外部应用程序的 URL(例如 GitLab 或自定义应用),然后点击 Create new link。
2) 配置 Consumer Key 和 Public Key
-
在创建应用链接的过程中:
- Consumer Key:自定义一个唯一的字符串标识应用程序(例如
jira-oauth-client
)。 - Public Key:需要将客户端的公钥粘贴到这里(私钥用于客户端请求使用)。
- Consumer Key:自定义一个唯一的字符串标识应用程序(例如
-
公钥的格式应为 PEM 格式,示例如下:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnVOGkhN0P3y+5FNceXGy q+YBl9cJpOyYsGnO94RtuOCmj/KFszDvn/dNqg2KjGvB5MgkHslZ8ZfZkXHZwIfB <...省略其余内容...> -----END PUBLIC KEY-----
3) 保存配置
- 确保填写的 Consumer Key 和 Public Key 在客户端代码中保持一致。
- 保存链接。
提示:在Jira中配置应用程序链接的【链入认证】时没有配置客户回调URL,只配置了客户关键字(consumer_key),RSA加密公钥(public_key)
在 JIRA 中配置 应用程序链接(Application Link) 时,如果没有 consumer_secret
值,这其实是正常的情况。JIRA 的 OAuth 1.0a 认证机制只需要配置 Consumer Key 和 Public Key。
JIRA OAuth1为什么没有 consumer_secret
?
-
OAuth 1.0a 认证:
- 在 JIRA 的 OAuth 1.0a 实现中,
consumer_secret
并不是必需的部分。 - JIRA 使用 Consumer Key 来标识应用程序,并通过 Public Key 验证签名。
- 在 JIRA 的 OAuth 1.0a 实现中,
-
与其他 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.0协议中callback在oauth认证的第二步(请求用户授权)中通过url参数设置并明文传输。新的1.0a协议中,callback作为oauth第一步(获取request token)的参数(oauth_callback),并参与到签名过程。此外当没有callback时,callback值必须设为oob(out-of-bound)。
- Provider在返回request token的同时,返回一个oauth_callback_confirmed参数,其值为true,表示Provider支持1.0a协议。
- 用户完成授权后,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
相关文章:

使用python调用JIRA6 进行OAuth1认证获取AccessToken
Jira配置应用程序链接 1) 创建应用程序链接 登录 JIRA 管理后台。转到 Administration > Applications > Application Links。在输入框中输入外部应用程序的 URL(例如 GitLab 或自定义应用),然后点击 Create new link。 2) 配置 Con…...

HTML5使用favicon.ico图标
目录 1. 使用favicon.ico图标 1. 使用favicon.ico图标 favicon.ico一般用于作为网站标志,它显示在浏览器的地址栏或者标签上 制作favicon图标 选择一个png转ico的在线网站,这里以https://www.bitbug.net/为例。上传图片,目标尺寸选择48x48&a…...

黑龙江锅包肉:酸甜香酥的东北经典
黑龙江锅包肉:酸甜香酥的东北经典 黑龙江锅包肉,作为东北菜的代表之一,尤其在黑龙江省哈尔滨市享有极高的声誉。这道美食不仅承载着丰富的历史文化内涵,更以其鲜明的地域特色,成为了黑龙江省乃至整个东北地区的标志性菜肴。 历史渊源 锅包肉的历史可以追溯到清朝光绪年间,其…...

Unity阿里云OpenAPI 获取 Token的C#【记录】
获取Token using UnityEngine; using System; using System.Text; using System.Linq; using Newtonsoft.Json.Linq; using System.Security.Cryptography; using UnityEngine.Networking; using System.Collections.Generic; using System.Globalization; using Cysharp.Thr…...

winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件
最近研究不安装office也可以保存Excel文件,在网上查询资料找到这个方法。 第一步:下载EPPlus.dll文件(自行去网上搜索下载) 第二步:引用到需要用的项目中,如图所示: 第三步:写代码…...

【C++基础】多线程并发场景下的同步方法
如果在多线程程序中对全局变量的访问没有进行适当的同步控制(例如使用互斥锁、原子变量等),会导致多个线程同时访问和修改全局变量时发生竞态条件(race condition)。这种竞态条件可能会导致一系列不确定和严重的后果。…...

C语言#define TSLP0 (TSLP_Regdef *)TSENSORO BASE ADDR)的含义?
在C语言中,#define指令用于定义宏。宏是一种预处理器指令,它允许你为代码片段指定一个名称,以便在编译时进行替换。 从你的描述来看,似乎你想定义一个名为 TSLP0 的宏,其值是某个寄存器地址。假设 TSENSORO_BASE_ADDR…...

微信小程序wxs实现UTC转北京时间
微信小程序实现UTC转北京时间 打脸一刻:最近在迭代原生微信小程序,好一段时间没写原生的,有点不习惯; 咦,更新数据咋不生效呢?原来还停留在 this.xxx; 哟,事件又没反应了?…...

提示词的艺术 ---- AI Prompt 进阶(提示词框架)
提示词的艺术 ---- AI Prompt 进阶(提示词框架) 写在前面 上周发布了一篇《提示词的艺术----AI Prompt撰写指南》,旨在帮助读者理解提示词的作用,以及简单的提示词撰写指南。本篇作为进阶内容,将给出常用的提示词框架…...

WPF常见面试题解答
以下是WPF(Windows Presentation Foundation)面试中常见的问题及解答,涵盖基础概念、高级功能和实际应用,帮助你更好地准备面试: 基础概念 什么是WPF? WPF是微软开发的用于构建桌面应用程序的UI框架&#x…...

TypeScript 学习
TypeScript 类型 准备本地环境 初始化 TypeScript 项目, 生成 package.json 文件: npm init -y安装 typescript: yarn add typescript -D初始化 TypeScript 配置文件: npx tsc--init输出: Created a new tsconfig.json with:target: es2016module: commonjsstrict: true…...

24_游戏启动逻辑梳理总结
首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…...

C++/CLI(Common Language Runtime)关键点详解
C++/CLI(Common Language Runtime)是 Microsoft Visual C++ 的一个扩展,允许使用 .NET Framework 的功能,同时保留对本机 C++ 代码的访问。当您需要在 C++ 和 C# 之间进行互操作时,C++/CLI 是一种常见的选择,因为它可以作为桥梁,将托管代码(如 C#)与非托管代码(如 C+…...

Transfoemr的解码器(Decoder)与分词技术
在自然语言处理(NLP)领域,解码器(Decoder)和分词技术是两个至关重要的概念。解码器是序列生成任务的核心组件,而分词则是将文本数据转换为可处理形式的基础步骤。 一、解码器(Decoder&…...

CDSN 2024博客之星总评选-主题文章创作,我的AI之路-起手篇
CDSN 2024博客之星总评选-主题文章创作,我的AI之路-起手篇 一. 回顾自己的机器学习之路二. 2024年的大模型学习三. 对自己的期望 一. 回顾自己的机器学习之路 自2019年起,我开始涉足机器学习领域,最初接触的是通过模型实现自动化的任务&…...

Android BitmapShader简洁实现马赛克,Kotlin(二)
Android BitmapShader简洁实现马赛克,Kotlin(二) 这一篇 Android BitmapShader简洁实现马赛克,Kotlin(一)-CSDN博客 遗留一个问题,xml定义的MyView为wrap_content的宽高,如果改成其…...

蓝桥杯 阶乘的和(C++完整代码+详细分析)
题目描述 原题链接 阶乘的和 问题描述 给定 n 个数 Ai,问能满足 m! 为 ∑(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 123⋯m。 输入格式 输入的第一行包含一个整数 n。 第二行包含 n 个整数,分别表示 Ai,相…...

【Bug 记录】el-sub-menu 第一次进入默认不高亮
项目场景: 项目场景:el-sub-menu 第一次进入默认不高亮 问题描述 例如:sub-menu 的 index 后端默认传过来是 number,我们需要手动转为 string,否则会有警告,而且第一次进入 sub-menu 默认不高亮。 解决方…...

SpringCloud两种注册中心
SpringCloud 基本概念 系统架构 我们之前做的所有的项目都属于单体架构,下面我们将要学习更适合大型项目的分布式架构 单体架构: 将业务的所有功能几种在一个项目中开发,打成一个包部署。 优点:架构简单、部署成本低 缺点&am…...

陕西羊肉泡馍:味蕾上的西北风情
陕西羊肉泡馍:味蕾上的西北风情 在广袤的西北地区,有一道美食以其独特的口感、丰富的营养价值和深厚的文化底蕴,成为了无数食客心中的佳肴——陕西羊肉泡馍。这道传统美食,不仅承载着陕西人民的饮食智慧,更以其醇厚的味道和暖胃耐饥的特性,赢得了国内外食客的一致赞誉。 历史渊…...

蓝桥杯试题:整数反转
一、题目要求: 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零 二、题目分析代码演示: 该程序的主要功能是接收一个整数输入&…...

Moretl FileSync增量文件采集工具
永久免费: <下载> <使用说明> 我们希望Moretl FileSync是一款通用性很好的文件日志采集工具,解决工厂环境下,通过共享目录采集文件,SMB协议存在的安全性,兼容性的问题. 同时,我们发现工厂设备日志一般为增量,为方便MES,QMS等后端系统直接使用数据,我们推出了增量采…...

day1代码练习
输出3-100以内的完美数,(完美数:因子和(因子不包含自身)数本身) #include <stdio.h>// 判断一个数是否为完美数的函数 int panduan(int n) {if (n < 2) {return 0; // 小于2的数不可能是完美数}int sum 1; // 因子和初始化为1(因…...

【Pytest】结构介绍
1.目录结构介绍 project_root/ │ ├── tests/ # 测试用例存放目录 │ ├── __init__.py │ ├── test_module1.py │ ├── module1.py # 被测试的模块 ├── conftest.py # pytest配置文件,可定义fixture和钩子函数 ├── py…...

Django基础之ORM
一.前言 上一节简单的讲了一下orm,主要还是做个了解,这一节将和大家介绍更加细致的orm,以及他们的用法,到最后再和大家说一下cookie和session,就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…...

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析
在Windows系统中,你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效,如图: 你可以使用以下代码: import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …...

检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作
联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 (不是点击了什么鼠标外加按键,这个鼠标除了左右和中间滚轮,没有其他按键了)...

web UI自动化测试笔记
在当今数字化转型的浪潮中,Web 应用已经无处不在,而其质量保障的关键之一就是自动化测试。想象一下,如果每次都手动验证 UI 功能,不仅耗时耗力,还容易遗漏问题。Python 的强大生态为 Web UI 自动化测试提供了高效的解决…...

计算机网络 (60)蜂窝移动通信网
一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于,将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域,称为蜂窝小区。每个小区设置一个基站,负责本小区内移…...

计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...