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

使用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

相关文章:

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

Jira配置应用程序链接 1) 创建应用程序链接 登录 JIRA 管理后台。转到 Administration > Applications > Application Links。在输入框中输入外部应用程序的 URL&#xff08;例如 GitLab 或自定义应用&#xff09;&#xff0c;然后点击 Create new link。 2) 配置 Con…...

HTML5使用favicon.ico图标

目录 1. 使用favicon.ico图标 1. 使用favicon.ico图标 favicon.ico一般用于作为网站标志&#xff0c;它显示在浏览器的地址栏或者标签上 制作favicon图标 选择一个png转ico的在线网站&#xff0c;这里以https://www.bitbug.net/为例。上传图片&#xff0c;目标尺寸选择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文件&#xff0c;在网上查询资料找到这个方法。 第一步&#xff1a;下载EPPlus.dll文件&#xff08;自行去网上搜索下载&#xff09; 第二步&#xff1a;引用到需要用的项目中&#xff0c;如图所示&#xff1a; 第三步&#xff1a;写代码…...

【C++基础】多线程并发场景下的同步方法

如果在多线程程序中对全局变量的访问没有进行适当的同步控制&#xff08;例如使用互斥锁、原子变量等&#xff09;&#xff0c;会导致多个线程同时访问和修改全局变量时发生竞态条件&#xff08;race condition&#xff09;。这种竞态条件可能会导致一系列不确定和严重的后果。…...

C语言#define TSLP0 (TSLP_Regdef *)TSENSORO BASE ADDR)的含义?

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

微信小程序wxs实现UTC转北京时间

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

提示词的艺术 ---- AI Prompt 进阶(提示词框架)

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

WPF常见面试题解答

以下是WPF&#xff08;Windows Presentation Foundation&#xff09;面试中常见的问题及解答&#xff0c;涵盖基础概念、高级功能和实际应用&#xff0c;帮助你更好地准备面试&#xff1a; 基础概念 什么是WPF&#xff1f; 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)与分词技术

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

CDSN 2024博客之星总评选-主题文章创作,我的AI之路-起手篇

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

Android BitmapShader简洁实现马赛克,Kotlin(二)

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

蓝桥杯 阶乘的和(C++完整代码+详细分析)

题目描述 原题链接 阶乘的和 问题描述 给定 n 个数 Ai​&#xff0c;问能满足 m! 为 ∑(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘&#xff0c;即 123⋯m。 输入格式 输入的第一行包含一个整数 n。 第二行包含 n 个整数&#xff0c;分别表示 Ai​&#xff0c;相…...

【Bug 记录】el-sub-menu 第一次进入默认不高亮

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

SpringCloud两种注册中心

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

陕西羊肉泡馍:味蕾上的西北风情

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

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...