首页 > 编程语言 >不背锅运维:Grafana的自动登入(Go和Python分别实现)

不背锅运维:Grafana的自动登入(Go和Python分别实现)

时间:2022-11-28 09:22:08浏览次数:58  
标签:背锅 http err 运维 Python url session cookie login

1. 实现目标

想要达到的目标是:当在浏览器向http://192.168.11.254:3090/auto_login这个地址发起GET请求后能够自动登入Grafana

2. 实现思路

需要额外开发一个API处理来自用户的登录请求,实现思路主要有2点:

  1. 通过代码登录grafana,得到cookie
  2. 携带这个cookie做重定向

图片

需要注意的地方:为了减少麻烦,这个API程序需要和grafana服务在同一台机器上跑起来,不然会有跨域的问题,跨域的话就不好携带这个cookie了,也不是不能实现,而是处理起来还是比较麻烦。

3. 实现分析

  1. 分析cookie

使用合法的账号密码手动登录成功后,服务端会向浏览器写入cookie,key是grafana_session,看下图:

  1. 分析登录表单

给到后端的密码字段是user

图片

给到后端的密码字段是password

图片

处理认证的path是/login(其实在地址栏就可以看到,但为了进一步确认还是要分析一下)

图片

该知道的都知道了,下面开始写代码实现这个处理登录请求的API,分享用go和python的实现

4. go的实现

package main

import (
 "io/ioutil"
 "log"
 "net/http"
 "strings"
)

const login_url = "http://192.168.11.254:3000/login"
const home_url = "http://192.168.11.254:3000/"

// 使用admin账号登陆获取cookie,我这里的密码是1qaz#EDC
func GetSession(url string) string {
 method := "POST"
    
 payload := strings.NewReader(`{` + " " + ` "user": "admin",` + " " + ` "password": "1qaz#EDC"` + " " + `}`)

 client := &http.Client{}
 req, err := http.NewRequest(method, url, payload)

 if err != nil {
  log.Println(err)
 }
 req.Header.Add("Content-Type", "application/json")

 res, err := client.Do(req)
 if err != nil {
  log.Println(err)
 }
 defer res.Body.Close()

 body, err := ioutil.ReadAll(res.Body)
 if err != nil {
  log.Println(err)
 }
 log.Println(string(body))
 cookie := res.Cookies()[0].Value
 return cookie
}

// 处理函数
func AutoLogin(w http.ResponseWriter, r *http.Request) {
 session := GetSession(login_url)
 if r.Method == "GET" {
        // 向浏览器写cookie
  cookie := http.Cookie{
   Name:  "grafana_session",
   Value: session,
  }
  http.SetCookie(w, &cookie)
        // 重定向
  http.Redirect(w, r, home_url, http.StatusMovedPermanently)
 }
}

// 拉起http服务和做路由
func Api() {
 http.HandleFunc("/auto_login", AutoLogin)
 err := http.ListenAndServe(":3080", nil)
 if err != nil {
  log.Println("ListenAndserve:", err)
 }
}


func main() {
    Api()
}

5. python的实现

import json
import requests

from flask import Flask, request, redirect, make_response

app = Flask(__name__)

login_url = "http://192.168.11.254:3000/login"
home_url = "http://192.168.11.254:3000/"


def get_session():
  payload = json.dumps({
    "user": "admin",
    "password": "1qaz#EDC"
  })
  headers = {
    'Content-Type': 'application/json'
  }
  response = requests.request("POST", login_url, headers=headers, data=payload)
  cookie = response.cookies.items()[0][1]
  return cookie

@app.route('/auto_login', methods=['GET'])
def auto_login():
  if request.method == 'GET':
    cookie = get_session()
    response = make_response(redirect(home_url))
    response.set_cookie('grafana_session', cookie)
    return response

if __name__ == "__main__":

  app.run("0.0.0.0", 3080)

6. 测试效果

代码写完了,下面测试测试效果,go和python的实现,最终达到的目的是一样的,请分别自行测试哈。

在浏览器访问:http://192.168.11.254:3090/auto_login

图片

完成自动登录

图片

写在最后:在go的实现中,第一次登入后且正常注销,再次通过API登录时,重定向到目标地址时向浏览器写入cookie会失败,导致直接去到登录页面,清除浏览器的历史记录和cookie(主要是清理掉cookie)啥的就能正常进入,这个问题我还在深入排查。知道怎么解决的盆友麻烦私聊我,感激不尽。

本文转载于(喜欢的盆友关注我们哦):https://mp.weixin.qq.com/s/FNt4DYZ3kMQuC3VaeDbOUg

标签:背锅,http,err,运维,Python,url,session,cookie,login
From: https://www.cnblogs.com/ttropsstack/p/16931320.html

相关文章

  • PYTHON 数据类型
    1.1数据类型数据都有类型,python的标准类型:数字:int,float,complex,bool字符串:str列表:list元组:tuple集合:set字典:dict可以用type()函数识别数据类型......
  • 如何使用Python查询在一个月内出现的重复订单?
    大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现Excel中查询在一个月内出现的重复订单问题,觉得还挺有用的,这里拿出来跟......
  • Python: 你所不知道的星号 * 用法
    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/FHyosiG_tegF5NRUEs7UdA本文大概1193个字,阅读需花6分钟内容......
  • CentOS6上python2.7安装memory_profiler报错
    由于我们需要分析python程序的内存占用问题,于是准备安装memory_profiler这个工具,但安装过程中各种报错,以下是安装报错截图和解决过程。1、安装/usr/local/python27/bin......
  • python中的文件操作
    起初data.txt文件是这样的#一直打开文件但却不关闭文件会导致内存溢出#在python,使用open函数,#可以打开一个已经存在的文件,或者创建一个新文件,#语法如下:open(......
  • 学习《Python编程 从入门到实践》第四天
    周末比工作日都要忙碌呢,一大堆家务事;要慢慢减少自己玩手机的时间,将时间用到有意义的事情上面去呢;不过能有几个小时做自己想去做的事情的时间,觉得还是蛮幸运的。道理大家......
  • python之OS模块
    1、简介OS模块是python中整理文件和目录最为常用的模块,该模块提供了非常丰富的方法用来处理文件和目录。  知识串讲:1)模块的安装和导入importos2)os.getcwd......
  • 《基于Python与OpenCV的人脸识别系统设计与实现》论文笔记二
    一、基本信息标题:基于Python与OpenCV的人脸识别系统设计与实现时间:2022来源:电脑知识与技术关键词:Python;OpenCV;人脸检测;人脸识别;二、研究内容问题定义:利用OpenCV......
  • 速记·python 123章
    第一、二、三章初识python1.1Python的概述开发环境:Python开发工具:IDLE(Python自带) 1.python的特点:代码简单、开发速度快、容易学习;有丰富的库;“胶水”语言2.Pyt......
  • Python第一章 油箱加满!准备出发!
    Python是种易学而强大的编程语言。它包含了高效的高级数据结构,能够用简单而高效的方式进行面向对象编程。Python优雅的语法和和动态类型,以及它天然的解释能力,使其成为了......