记录获取蓝鲸智云token的过程

2023-11-12

一、使用python脚本获取蓝鲸智云token

python版本环境:3.11

# -*- coding: utf-8 -*-
import requests

def get_user_token(domain,user,password):
    '''模拟用户登录,并返回 bk_token 和 bk_csrftoken'''
    BK_PAAS_HOST = domain
    USERNAME = user
    PASSWORD = password
    response = requests.get('{0}/login/?c_url=/'.format(BK_PAAS_HOST), verify=False)
    bklogin_csrftoken = response.cookies.get('bklogin_csrftoken')
    url = "{0}/login/?c_url=/".format(BK_PAAS_HOST)
    headers = {
      "Host": BK_PAAS_HOST.split("//")[1],
      "Origin": BK_PAAS_HOST,
      "Referer": "{0}/login/?c_url=/".format(BK_PAAS_HOST),
      "Cookie": "bklogin_csrftoken={}".format(bklogin_csrftoken),
      'Content-Type': 'application/x-www-form-urlencoded'
    }
    data = {
      "csrfmiddlewaretoken": bklogin_csrftoken,
      "username": USERNAME,
      "password": PASSWORD,
    }
    req2 = requests.post(url=url,
                       data=data,
                       headers=headers,
                       verify=False,
                       allow_redirects=False)
    bk_token = req2.cookies.get("bk_token")
    bk_csrftoken = req2.cookies.get("bklogin_csrftoken")
    return bk_token, bk_csrftoken

aaa,bbb = get_user_token('http://XXX.com','***','***')
print('bk_token',aaa)
print('bk_csrftoken',bbb)

二、需要将python脚本转化为java代码

注:我们注意到在python脚本中,为获取登录token需要对同一个登录地址做了两次请求:

在第一次get请求中,我们从响应体的cookie中获取到了bklogin_csrftoken参数的值。

在第二次进行post请求时,需要将bklogin_csrftoken的值放入到请求头的Cookie中,并且Post请求需要做ssl安全验证。

此时对同一个登录地址需要从get请求转换到post请求,这时会存在两个问题,

问题一:HTTP的响应码会返回302或者307,文章末尾会附上对这两个状态码的解释,设置请求禁止HTTP重定向,对应脚本中对应的 allow_redirects=False

问题二:如果不设置SSL信任所有证书,就会存在证书验证不通过。但是不建议完全信任所有SSL证书,因为这会降低安全性。通常,应该使用合适的证书来验证SSL连接,对应脚本中verify=False。

因此我们需要在java代码中处理连接请求设置SSL认证和禁止重定向。

代码如下:

import okhttp3.*;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;

public class OkHttpExample {

    public static void main(String[] args) {
        String domain = "http://***.com";
        String url = "http://***.com/login/?c_url=/";
        String bklogin_csrftoken = "";
        String username = "***";
        String password = "***";
        String bk_token = "";

        try {

            // 创建信任所有证书的TrustManager
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[0];
                        }

                        public void checkClientTrusted(X509Certificate[] certs, String authType) {
                        }

                        public void checkServerTrusted(X509Certificate[] certs, String authType) {
                        }
                    }
            };

            // 创建SSL上下文,信任所有证书
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // 设置SSL Socket Factory,信任所有证书
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();

            // 设置SSL Socket Factory
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);

            // 禁止HTTP重定向
            builder.followRedirects(false);

            OkHttpClient client = builder.build();

            // 创建GET请求
            Request request = new Request.Builder()
                    .url(url)
                    .build();

            // 执行GET请求
            Response response = client.newCall(request).execute();

            if (response.isSuccessful()) {
                // 获取响应中的所有Cookie
                String cookies = response.header("set-cookie");
                bklogin_csrftoken = extractCsrfToken(response.headers(), "bklogin_csrftoken=");
                // 打印Cookie信息
                System.out.println("Cookies: " + cookies);
            } else {
                System.out.println("Request was not successful. Response code: " + response.code());
            }
            // 创建POST请求
            RequestBody requestBody = new FormBody.Builder()
                    .add("csrfmiddlewaretoken", bklogin_csrftoken)
                    .add("username", username)
                    .add("password", password)
                    .build();

            Request request2 = new Request.Builder()
                    .url(url)
                    .addHeader("Cookie", "bklogin_csrftoken=" + bklogin_csrftoken)
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .post(requestBody)
                    .build();

            // 执行POST请求
            Response response2 = client.newCall(request2).execute();
            bk_token = extractCsrfToken(response2.headers(), "bk_token=");
            System.out.println("bk_token =" + bk_token);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
    }

    private static String extractCsrfToken(Headers headers, String nameValue) {
        for (int i = 0; i < headers.size(); i++) {
            String name = headers.name(i);
            String value = headers.value(i);
            if ("set-cookie".equalsIgnoreCase(name) && value.startsWith(nameValue)) {
                String[] parts = value.split(";");
                for (String part : parts) {
                    if (part.startsWith(nameValue)) {
                        return part.substring(nameValue.length());
                    }
                }
            }
        }
        return null;
    }
}

 打印结果:

Cookies: bklogin_csrftoken=UJ2W48tw******ftsmnSpScu*******AOcJIduYnGwt3a2oE8B; expires=Wed, 04 Sep 2024 07:29:08 GMT; Max-Age=31449600; Path=/; SameSite=Lax
bk_token =bkcrypt%24gAAAAABk-CpELzYtclVMOivK8obn3V*******NDqeOE6TxUiTA******MRx6pMrIbT7NTDoGyk-LuocQEyL8N5vN3pk7Vc%3D

请求蓝鲸智云接口时,请求头 需要带上Cookie参数,如下:

参数格式: Cookie:bk_token=****

 302 与 303、307 的关系
区别
        从实际效果看,302 允许各种各样的重定向,一般情况下都会实现为到 GET 的重定向,但是不能确保 POST 会重定向为 POST;而 303 只允许任意请求到 GET 的重定向;307 和 302 一样,除了不允许 POST 到 GET 的重定向。

那为什么有了 307 和 303 还需要 302呢?

        302 在最初的定义中,内容和现在的 307 是一样的,不允许重定向方法的改写(从 POST 到 GET,由于 GET 不应该有 body,实际上 body 也被改了)。但是早期浏览器在实现的时候有的实现成 303 的效果,有的实现成 307 的效果。于是在之后的标准,302 在某些浏览器中错误的实现被写进规范,成为 303,而 302 原本的效果被复制了到了 307。在最近的一次标准修订中,302 标准被修改成不再强制需要维持原请求的方法。所以就产生了现在的 302、303 和 307 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录获取蓝鲸智云token的过程 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 在Linux虚拟机上安装QT

    一 安装虚拟机 运行VMware workstation full 11 1 0 2496824 exe 二 在虚拟机上安装Linux 1 下载Ubuntu桌面版 从官网进入 选择 桌面版 按照提示进行下载 国内的一个镜像网址是 http
  • NC65 查询模板参照字段启用参照是否包含下级

    NC65 查询模板参照字段 勾选参照是否包含下级时 选择完参照字段返回的查询条件 参照字段的值是一个sql语句 无法查询到正确数据 当查询模板字段勾选了是否查询条件时 通过getQryDLGDelegator getGeneralCondt
  • 华为有没有公开鸿蒙系统,华为捐赠鸿蒙最核心基础架构该如何看待?

    原标题 华为捐赠鸿蒙最核心基础架构该如何看待 6月2日 华为 鸿蒙操作系统 正式发布 这是一款面向全场景的分布式操作系统 和苹果安卓等手机电脑系统不同 鸿蒙系统可用于物联网各种设备 从目前市场上的操作系统市场比例上看 安卓占据了全球68 6
  • 拉链表设计详解

    拉链表设计原理 将拉链表和每日增量数据做左连接 每日增量没有匹配的数据和拉链表endtime lt 99991231的数据保持不变 其他的endtime变为每日增量的starttime 1 如果数据发生修改 拉链表和增量数据左连接 将拉链表
  • Flask之methods、url_for进行反解析、request的使用、上传文件、abort函数与自定义异常处理、元组、使用jsonify返回json数据、设置和读取cookie

    Flask利用methods限制访问方式 在flask中 可以使用在路由装饰器中使用methods 访问方式 同一视图中可以同时存在多种访问方式 通过methods限定访问方式 app route post only methods POS
  • docker-py(Docker SDK for Python)使用指南

    文章目录 前言 1 docker客户端 2 docker镜像 3 docker容器 4 使用示例 结束语 前言 本篇博客围绕官方提供的python版的docker Engine API Docker SDK for Python 结合具体示
  • 敏感数据明文传输(密码)

    1 加密过程 加密分为单向和双向 拿登录功能来说 密码的加密发送 双向加密就是可逆的 这边加密 那边解密后跟数据库里的密码比对 单向是不可逆的 这边加密 那边无法解密 比对的方式是从数据库里拿出该用户的密码 进行同样的加密 比对加密后的值是
  • Python 下opencv 应用: 物体数数

    物体数数 物体个数计算 就是计算一个图形中有多少物体 python 下用opencv 打开一个图形文件 图形处理 计算图中物体的个数 除了opencv 要安装好外 还要装好 imutils imutils 的下载和安装在 Python 下应
  • 【深入理解C++】给表达式赋值

    在 C 语言中表达式是不可以被赋值的 但是在 C 中可以 include
  • linux设备驱动之USB主机控制器驱动分析

    inux设备驱动之USB主机控制器驱动分析 本文系本站原创 欢迎转载 转载请注明出处 http ericxiao cublog cn 一 前言 Usb是一个很复杂的系统 在usb2 0规范中 将其定义成了一个分层模型 linux中的代码也是
  • npm安装指定版本的npm、typescript、yarn、lerna并查看版本号+nvm安装切换不同版本node

    nvm安装后 nvm ls列出所有node已安装版本 nvm install 版本号 安装node指定版本 nvm use 版本号 使用 切换 node版本 要使用nvm才能安装npm 先全局卸载 npm uninstall g types
  • 数据库判断

    正确 索引可以加快数据的查找速度 但是会给数据更新带来额外性能消耗 数据库管理系统软件都是基于某种数据模型而设计的 逻辑模型和物理模型都是按照计算机系统的观点对数据建模的 所有教师抽象为一类实体 使用 教师 工号 姓名 性别 表达起来的概念
  • 全连接层

    1 将前一层输出的二维特征图综合起来转化为一维向量 它的每一个节点都与上一层的每个节点连接 2 全连接层的主要作用是将输入图像在经过卷积和池化操作后提取的特征进行压缩 并且根据压缩的特征完成模型的分类功能 在整个卷积神经网络中起到 分类器
  • __attribute__((weak))的使用

    一 背景 我们不确定外部模块是否提供一个函数func 但是我们不得不用这个函数 举个例子 A B两个模块 A模块调用了B模块的函数 但是不确定B模块是否提供了该函数 但是又不得不调用 这个时候在A模块中再申明一个弱符号函数 即用weak 如
  • 浮点精度 加减乘除 原生方法

    关于JavaScript 二进制精度问题 浮点数的计算精度会存在缺失问题 专门去百度了一下解决方案 发现有的不是很全 再不就是在项目里面使用会报错 不支持with用法 等等问题 所以针对这四个方法 自己 写了一下 一般我们是放在utils或
  • Linux 分区扩容

    虚拟机磁盘空间250G 克隆后系统分区空间只有200G 通过resize2fs扩容分区 suer pro 22 244 sudo fdisk l 磁盘 dev sda 268 4 GB 268435456000 字节 524288000 个
  • 【C++】C语言基础部分知识点总结 (指针,函数,内存,关键字,预处理等)(秋招篇)

    文章目录 前言 讲一下32位系统常用数据类型的字节大小 stm32f103为例 讲一些C C 中常见的库 什么是易变变量 代码的转化和构建通常会经历哪几个步骤 预处理 编译 汇编 链接 介绍一下C C 常用的关键字 介绍一些const的使用
  • python 基础绘图(关于随时间序列变动的图的画法)

    画这种图要考虑两点 1 如何生成连续的时间轴 2 如何在图中适当的显示轴标签的样式和数量 import matplotlib pyplot as plt import matplotlib as mpl import numpy as np
  • Collection排序

    使用Collection的sort方法可以对List对象进行排序 其中Record为自己定义的类 包含value index count三个成员变量 ArrayList
  • 记录获取蓝鲸智云token的过程

    一 使用python脚本获取蓝鲸智云token python版本环境 3 11 coding utf 8 import requests def get user token domain user password 模拟用户登录 并返回