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


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

    python版本环境:3.11

    1. # -*- coding: utf-8 -*-
    2. import requests
    3. def get_user_token(domain,user,password):
    4. '''模拟用户登录,并返回 bk_token 和 bk_csrftoken'''
    5. BK_PAAS_HOST = domain
    6. USERNAME = user
    7. PASSWORD = password
    8. response = requests.get('{0}/login/?c_url=/'.format(BK_PAAS_HOST), verify=False)
    9. bklogin_csrftoken = response.cookies.get('bklogin_csrftoken')
    10. url = "{0}/login/?c_url=/".format(BK_PAAS_HOST)
    11. headers = {
    12. "Host": BK_PAAS_HOST.split("//")[1],
    13. "Origin": BK_PAAS_HOST,
    14. "Referer": "{0}/login/?c_url=/".format(BK_PAAS_HOST),
    15. "Cookie": "bklogin_csrftoken={}".format(bklogin_csrftoken),
    16. 'Content-Type': 'application/x-www-form-urlencoded'
    17. }
    18. data = {
    19. "csrfmiddlewaretoken": bklogin_csrftoken,
    20. "username": USERNAME,
    21. "password": PASSWORD,
    22. }
    23. req2 = requests.post(url=url,
    24. data=data,
    25. headers=headers,
    26. verify=False,
    27. allow_redirects=False)
    28. bk_token = req2.cookies.get("bk_token")
    29. bk_csrftoken = req2.cookies.get("bklogin_csrftoken")
    30. return bk_token, bk_csrftoken
    31. aaa,bbb = get_user_token('http://XXX.com','***','***')
    32. print('bk_token',aaa)
    33. 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认证和禁止重定向。

    代码如下:

    1. import okhttp3.*;
    2. import javax.net.ssl.SSLContext;
    3. import javax.net.ssl.SSLSocketFactory;
    4. import javax.net.ssl.TrustManager;
    5. import javax.net.ssl.X509TrustManager;
    6. import java.io.IOException;
    7. import java.security.KeyManagementException;
    8. import java.security.NoSuchAlgorithmException;
    9. import java.security.cert.X509Certificate;
    10. public class OkHttpExample {
    11. public static void main(String[] args) {
    12. String domain = "http://***.com";
    13. String url = "http://***.com/login/?c_url=/";
    14. String bklogin_csrftoken = "";
    15. String username = "***";
    16. String password = "***";
    17. String bk_token = "";
    18. try {
    19. // 创建信任所有证书的TrustManager
    20. TrustManager[] trustAllCerts = new TrustManager[]{
    21. new X509TrustManager() {
    22. public X509Certificate[] getAcceptedIssuers() {
    23. return new X509Certificate[0];
    24. }
    25. public void checkClientTrusted(X509Certificate[] certs, String authType) {
    26. }
    27. public void checkServerTrusted(X509Certificate[] certs, String authType) {
    28. }
    29. }
    30. };
    31. // 创建SSL上下文,信任所有证书
    32. SSLContext sslContext = SSLContext.getInstance("TLS");
    33. sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    34. // 设置SSL Socket Factory,信任所有证书
    35. SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
    36. OkHttpClient.Builder builder = new OkHttpClient.Builder();
    37. // 设置SSL Socket Factory
    38. builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
    39. // 禁止HTTP重定向
    40. builder.followRedirects(false);
    41. OkHttpClient client = builder.build();
    42. // 创建GET请求
    43. Request request = new Request.Builder()
    44. .url(url)
    45. .build();
    46. // 执行GET请求
    47. Response response = client.newCall(request).execute();
    48. if (response.isSuccessful()) {
    49. // 获取响应中的所有Cookie
    50. String cookies = response.header("set-cookie");
    51. bklogin_csrftoken = extractCsrfToken(response.headers(), "bklogin_csrftoken=");
    52. // 打印Cookie信息
    53. System.out.println("Cookies: " + cookies);
    54. } else {
    55. System.out.println("Request was not successful. Response code: " + response.code());
    56. }
    57. // 创建POST请求
    58. RequestBody requestBody = new FormBody.Builder()
    59. .add("csrfmiddlewaretoken", bklogin_csrftoken)
    60. .add("username", username)
    61. .add("password", password)
    62. .build();
    63. Request request2 = new Request.Builder()
    64. .url(url)
    65. .addHeader("Cookie", "bklogin_csrftoken=" + bklogin_csrftoken)
    66. .addHeader("Content-Type", "application/x-www-form-urlencoded")
    67. .post(requestBody)
    68. .build();
    69. // 执行POST请求
    70. Response response2 = client.newCall(request2).execute();
    71. bk_token = extractCsrfToken(response2.headers(), "bk_token=");
    72. System.out.println("bk_token =" + bk_token);
    73. } catch (IOException e) {
    74. e.printStackTrace();
    75. } catch (NoSuchAlgorithmException e) {
    76. e.printStackTrace();
    77. } catch (KeyManagementException e) {
    78. e.printStackTrace();
    79. }
    80. }
    81. private static String extractCsrfToken(Headers headers, String nameValue) {
    82. for (int i = 0; i < headers.size(); i++) {
    83. String name = headers.name(i);
    84. String value = headers.value(i);
    85. if ("set-cookie".equalsIgnoreCase(name) && value.startsWith(nameValue)) {
    86. String[] parts = value.split(";");
    87. for (String part : parts) {
    88. if (part.startsWith(nameValue)) {
    89. return part.substring(nameValue.length());
    90. }
    91. }
    92. }
    93. }
    94. return null;
    95. }
    96. }

     打印结果:

    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 。

  • 相关阅读:
    在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析
    【Java 基础篇】Java Function 接口详解
    栈的概念|动态顺序栈的详细解析|静态顺序栈&链式栈的代码参考
    WinForm简洁有效的项目框架结构
    临时变量的讲究
    【Nacos】Nacos服务注册服务端源码分析(一)
    总结数据结构常用树
    第一周 一起走进摄影世界
    docker容器创建的流程详解
    深入理解计算机网络-4信号编码与调制4
  • 原文地址:https://blog.csdn.net/qq_43511677/article/details/132715556