使用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.rhkb.cn/news/7086.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ---面试题

常见面试题 1.MQ的作用及应用场景 类似问题&#xff1a;项目什么情况下用到了MQ&#xff0c;为什么要用MQ MQ的主要应用场景&#xff0c;消息队列的应用场景&#xff0c;为什么说消息队列可以削峰 首先MQ是一种用来接收和转发消息的队列&#xff0c;常见的应用常见如下&…

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…

2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计

一、高并发内存池框架设计 高并发池框架设计&#xff0c;特别是针对内存池的设计&#xff0c;需要充分考虑多线程环境下&#xff1a; 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率&#xff0c;减少锁竞争和内存碎片。 高并发内存…

WebODM之python实现

1、安装webodm_slam 主要是了解API文档,查看之前的文章 安装WebODM_slate 2、安装webodm 查看之前的文章 Win10安装WebODM和操作全流程 3、python脚本 项目案例 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of…

2025年美赛C题:奥运奖牌榜模型 解析及Python代码实现

2025年美赛C题&#xff1a;奥运奖牌榜模型 解析及Python代码实现 1 题目 2025 MCM问题C&#xff1a;奥运奖 牌榜模型在最近的2024年巴黎夏季奥运会期间&#xff0c; 粉丝们除了观看个人项目外&#xff0c; 还关注每个 国家的整体 “ 奖牌榜 ”。 最终的结果&#xff08;表1&am…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅

一、引言 在当今数字化时代&#xff0c;构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架&#xff0c;以其快速开发、简洁配置和丰富的生态支持&#xff0c;深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架&#xff…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法&#xff0c;步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一&#xff0e;软硬…

快门:凝固瞬间与塑造动感的魔法开关

目录 一、快门的基本概念 二、快门速度的分类及效果 &#xff08;一&#xff09;高速快门 &#xff08;二&#xff09;低速快门 &#xff08;三&#xff09;安全快门 三、快门优先模式&#xff1a;掌控拍摄节奏的利器 四、快门与其他摄影要素的关系 &#xff08;一&…

2025发文新方向:AI+量化 人工智能与金融完美融合!

2025深度学习发论文&模型涨点之——AI量化 人工智能的融入&#xff0c;使量化交易实现了质的突破。借助机器学习、深度学习等先进技术&#xff0c;人工智能可高效处理并剖析海量市场数据&#xff0c;挖掘出数据背后错综复杂的模式与趋势&#xff0c;从而不仅提升了数据分析…

单链表算法实战:解锁数据结构核心谜题——链表的回文结构

题目如下&#xff1a; 解题过程如下&#xff1a; 回文结构举例&#xff1a; 回文数字&#xff1a;12521、12321、1221…… 回文字符串&#xff1a;“abcba”、“abba”…… 并不是所有的循环嵌套的时间复杂度都是O(n^2) 可以用C写C程序&#xff1a; C里可以直接使用ListNode…

golang网络编程

socket编程 socket图解 Socket是BSD UNIX的进程通信机制&#xff0c;通常也称作”套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。Socket可以理解为TCP/IP网络的API&#xff0c;它定义了许多函数或例程&#xff0c;程序员可以用它们来开发TCP/IP网…

「 机器人 」仿生扑翼飞行器中的“被动旋转机制”概述

前言 在仿生扑翼飞行器的机翼设计中,模仿昆虫翼的被动旋转机制是一项关键技术。其核心思想在于:机翼旋转角度(攻角)并非完全通过主动伺服来控制,而是利用空气动力和惯性力的作用,自然地实现被动调节。以下对这种设计的背景、原理与优势进行详细说明。 1. 背景:昆虫的被动…

git远程仓库如何修改

1.需要做的事情&#xff1a;把git的远程仓库修改掉&#xff0c;在git创建一个自己的仓库 如果你是私有化的话&#xff0c;可以生成一个自己token令牌也可以。到时候push的时候会让你登录你就可以输入你的token令牌和用户名。 2.查看当前仓库的远程地址是不是自己的 &#xff…

罗氏线圈的学习【一】

TI的罗氏线圈介绍&#xff0c;讲解的非常好&#xff1a; 具有低功耗低成本性能的PCB罗氏线圈与积分电路设计 罗氏线圈&#xff08;Rogowski Coil&#xff09;是一种常见的电流测量装置&#xff0c;广泛用于高精度和非接触式的电流测量场景&#xff0c;尤其是在测量交流电流、…

计算机视觉-卷积

卷积-图像去噪 一、图像 二进制 灰度 彩色 1.1二进制图像 0 1 一个点可以用一个bit&#xff08;0/1&#xff09;来表示 1.2灰度图像 0-255 一个点可以用一个byte来表示 1.3彩色图像 RGB 表达一个彩色图像先说它的分辨率p/w&#xff08;宽&#xff09;和q/h&#xff08;高…

Ansys Thermal Desktop 概述

介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源&#xff1a;CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…

32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)

背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;一&#xff09; 继续stdio测试的分析&#xff0c;上篇讲到标准IO端口初始化&#xff0c;单从测试内容来说其实很简单&#xff0c;没啥可分析的&#xff0c;但这几篇…

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF&#xff1a;理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…