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

news2024/10/1 21:31:47

一、使用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 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现小程序与h5页面间的跳转

接到新需求&#xff0c;要在小程序页面内点击按钮实现跳转h5&#xff0c;一开始没接触过&#xff0c;还挺头疼的&#xff0c;但真正做起来&#xff0c;也就那么一回事啦&#xff0c;废话少说&#xff0c;直接上 1. 配置域名 先登录小程序开发平台&#xff0c;将页面需要跳转的…

Java学习笔记---多态

面向对象三大特征之一&#xff08;继承&#xff0c;封装&#xff0c;多态&#xff09; 多态的应用场景&#xff1a;根据传递对象的不同&#xff0c;调用不同的show方法 一、多态的定义 同类型的对象&#xff0c;表现出的不同形态&#xff08;对象的多种形态&#xff09; 二…

Tomcat详解 一:tomcat的部署

文章目录 1. Tomcat的基本介绍1.1 Tomcat是什么1.2 Tomcat的构成组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器&#xff08;JAVA Scripts page&#xff09; 1.3 核心功能1.3.1 Container 结构分析 1.4 配置文件1.5 Tomcat常用端口号1.6 启动和关闭Tomcat 2. 部署Tomcat服务…

DockerCompose部署es和kibana

DockerCompose文件 version: 3.1 services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueports:- "9200:9200"- "9300:9300"environment:- ES_JAVA_OPTS-Xms128m -Xmx1024m #设置使用jvm内存大小- cluster.na…

【unity3D】如何修改相机的默认视角

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的&#xff1a; 此时Scene窗口的视角是这样的&…

申请Tik Tok的菲律宾公会需要什么条件?

近年来的跨境电商出海各个国家&#xff0c;使得跨境电子商务在全球范围内迅猛发展。菲律宾作为东南亚地区的重要经济体之一&#xff0c;其电商市场也呈现出蓬勃的增长势头。本文将介绍菲律宾国内外电商的发展趋势&#xff0c;并分析目前菲律宾的市场团队佳薇cmxyci 神秘代码开启…

论文解读 | 点对照:3D点云理解无监督式预训练

原创 | 文 BFT机器人 《PointContrast: Unsupervised Pre-training for 3D Point Cloud Understanding》是一篇关于三维点云数据理解领域的研究论文&#xff0c;旨在提出一种无监督预训练方法&#xff0c;以改善对三维点云数据的理解。 01 背景 三维点云数据是从传感器&#…

手写Spring:第4章-基于Cglib实现含构造函数的类实例化策略

文章目录 一、目标&#xff1a;含构造函数的类实例化二、设计&#xff1a;含构造函数的类实例化三、实现&#xff1a;含构造函数的类实例化3.1 工程结构3.2 含构造函数的类实例化类图3.3 类实例化策略3.3.1 定义实例化策略接口3.3.2 JDK实例化3.3.3 Cglib实例化 3.4 抽象类定义…

INS惯性导航系统相关技术(概念版)

一、参考资料 组合导航系统生产商 applanix 官网 新手入门系列3——Allan方差分析方法的直观理解 惯性测量单元Allan方差分析详解 IMU标定之—Allan方差 b站视频&#xff1a;武汉大学惯性导航课程合集【2021年秋】 资料下载&#xff1a;PPT&#xff1a;《惯性导航原理与方法》…

nginx-ingress多控制器部署

nginx-ingress直接使用yaml来部署 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml修改里面的镜像 多控制器部署实现&#xff1a; 在同一个命名空间中只需要新增一个IngressClass跟 ingress-…

EFG-02-10-31、ERBG-06-B-51电液比例控制调速阀放大器

EFCG-02-10-31、EFG-03-60-26、EFCG-03-125-26、EFCG-03-125-51、EFG-06-250-22、EFCG-06-250-22、EFG-06-250-51、EFCG-02-30-31、ERBG-06-B-51、ERBG-10-C-51、ERBG-06-H-51、ERBG-10-B-51、ERBG-06-C-51、ERBG-10-H-51、EFG-02-10-31、EFCG-03-60-26、EFG-03-125-26、EFG-03…

Mysql存储过程与存储函数

文章目录 1. 简介2. 存储过程的特点3. 存储过程操作语法4. 存储过程变量5. 其它语法6. 存储函数 1. 简介 存储过程是事先经过编译并存储在数据库中的一段SQL集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&a…

生成式AI的JavScript技术栈

如果不使用新的软件基础设施技术&#xff0c;就很难理解它们。 至少&#xff0c;a16z 基础设施团队发现了这一点&#xff0c;而且因为我们中的许多人都是以程序员的身份开始职业生涯的&#xff0c;所以我们经常通过实践来学习。 尤其是生成式AI浪潮的情况尤其如此&#xff0c;它…

使用Blender 在影片剪辑上创建粘滞标签

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 准备场景 步骤 1 在新文件中&#xff0c;右键单击默认立方体和灯光&#xff0c;然后按键盘上的 Del 将其删除。按住 Shift 键&#xff0c;然后右键单击以选择多个对象。 删除默认对象 步骤 2 选择摄像机并按 Alt-R …

问道管理:申购额度如何计算?

在投资领域&#xff0c;很多人会选择申购基金产品。对于大众投资者而言&#xff0c;申购额度是一个较为要害的问题。在此&#xff0c;我们将从多个角度进行剖析&#xff0c;具体解读申购额度怎么核算。 一、基金公司规则 首要&#xff0c;申购额度需要依照基金公司的规则来进行…

js 高精度计算 - decimal.js 库

what decimal.js &#xff1f; decimal.js是一个用于进行精确数值计算的第三方库。通常情况下&#xff0c;当你需要进行对精度要求较高的数值计算时&#xff0c;可以考虑使用decimal.js或类似的库。 JavaScript中的原生Number类型使用双精度浮点数表示&#xff0c;对于某些计算…

torch.cuda.is_available() 解决方案

本人使用的显卡如下&#xff0c;打开任务管理器查看 Anaconda下载哪个版本都可以 使用命令conda create -n pytorch python3.6创建一个名为pytorch的环境&#xff0c;解释器使用3.6的 使用命令conda activate pytorch进入该环境 进入pytorch官网&#xff0c;选择下列选项 …

SPSS教程:手把手教你绘制簇状条形图

SPSS教程&#xff1a;手把手教你绘制簇状条形图 1、问题与数据 某研究者拟分析受教育程度和性别对幸福指数的影响程度&#xff0c;招募了58位研究对象&#xff0c;包括28位男性和30位女性。每一类性别中&#xff0c;研究对象的受教育程度均分为3类&#xff08;高中及以下、大…

Spring原生api操作之如何在spring配置文件添加Bean对象到Spring容器

一、创建一个spring项目 为了使用Spring的原生api&#xff0c;首先要创建一个只基于Spring的项目. 创建maven项目引入spring依赖&#xff08;不要使用6版本以上的&#xff0c;6的最低兼容jdk为jdk17&#xff09;创建spring配置文件 这个配置文件的名称固定&#xff0c;但是必须…

935. 骑士拨号器

935. 骑士拨号器 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 935. 骑士拨号器 https://leetcode.cn/problems/knight-dialer/description/ 完成情况&#xff1a; 解题思路&#xff1a; 题目要求&#xff1a;键…