脚本如何保存登录状态

wen 实用脚本 19

本文目录导读:

脚本如何保存登录状态

  1. 浏览器脚本(JavaScript/Chrome扩展等)
  2. 命令行脚本(Python/Bash/Node.js)
  3. HTTP API 客户端脚本(curl/Postman/Insomnia)
  4. 💡 安全注意事项(非常重要!)

保存登录状态的核心思路是在客户端安全地存储凭证,并在后续请求中自动携带,根据你的应用类型(浏览器网页、移动App、命令行脚本),实现方式有所不同。

以下是三种主流场景的详细方案:

浏览器脚本(JavaScript/Chrome扩展等)

使用 localStoragesessionStorage(最常用)

  • 原理:登录成功后,服务器返回一个 Token(如 JWT),脚本将其存储在浏览器本地。
  • 特点
    • localStorage:关闭浏览器后状态仍保留(持久)。
    • sessionStorage:关闭浏览器后自动清除(临时会话)。
  • 缺点存在 XSS(跨站脚本攻击)风险,存储敏感信息需谨慎。
// 登录成功后
localStorage.setItem('auth_token', 'your_jwt_token');
// 后续请求自动携带
fetch('https://api.example.com/data', {
    headers: {
        'Authorization': `Bearer ${localStorage.getItem('auth_token')}`
    }
});

使用 Cookies(更安全,推荐)

  • 原理:服务器通过 Set-Cookie 头部设置 HttpOnly Cookie,脚本无法直接读取,但浏览器会在每个同源请求中自动发送。
  • 特点
    • 需要服务器配合设置 HttpOnly(防止XSS读取)、Secure(仅HTTPS)、SameSite(防止CSRF)。
    • 适合有后端的全栈应用。

使用 IndexedDB(存储大量复杂状态)

  • 适用于需要保存大量离线数据或复杂对象(如缓存整个用户资料)的场景。

命令行脚本(Python/Bash/Node.js)

这类脚本没有浏览器环境,需要手动管理状态。

推荐方案:存储到文件(JSON/文本)

  1. 登录:发出请求,获取 Token。
  2. 保存:将 Token 写入本地文件(如 session.json)。
  3. 复用:每次发出请求前,读取文件,将 Token 放入 Headers。

Python 示例(使用 requests 库 + Requests.Session):

import requests
import json
import os
SESSION_FILE = 'session.json'
def login_and_save(api_url, username, password):
    session = requests.Session()
    response = session.post(api_url + '/login', json={
        'username': username,
        'password': password
    })
    data = response.json()
    # 假设返回的 token 在 data['token'] 中
    session_data = {'cookies': session.cookies.get_dict(), 'token': data.get('token')}
    with open(SESSION_FILE, 'w') as f:
        json.dump(session_data, f)
    return session_data
def load_session():
    """恢复会话"""
    if not os.path.exists(SESSION_FILE):
        return None
    with open(SESSION_FILE, 'r') as f:
        return json.load(f)
def create_authenticated_session():
    session_data = load_session()
    if session_data:
        session = requests.Session()
        # 恢复cookies
        session.cookies.update(session_data.get('cookies', {}))
        # 或使用Bearer Token
        if session_data.get('token'):
            session.headers.update({
                'Authorization': f"Bearer {session_data['token']}"
            })
        return session
    else:
        return None
# 使用示例
if __name__ == '__main__':
    sess = create_authenticated_session()
    if sess:
        # 直接使用,无需再次登录
        response = sess.get('https://api.example.com/user/profile')
        print(response.json())
    else:
        # 首次登录
        login_and_save('https://api.example.com', 'user', 'pass')

进阶方案:使用 keyring 库(安全存储敏感信息)

  • 将 Token 存储到操作系统的密码管理器(Windows 凭据管理器、macOS Keychain、Linux Secret Service)。
  • pip install keyring
import keyring
# 保存
keyring.set_password("MyScriptService", "auth_token", "your_token_here")
# 读取
token = keyring.get_password("MyScriptService", "auth_token")

HTTP API 客户端脚本(curl/Postman/Insomnia)

  • Postman/Insomnia

    • 使用环境变量 {{token}}
    • 在 Tests 脚本中写:pm.environment.set("token", pm.response.json().token);
    • 后续请求的 Headers 中引用 Bearer {{token}}
  • Bash (curl)

    • 登录后将 Token 存入环境变量或临时文件:

      # 登录并提取token
      TOKEN=$(curl -s -X POST https://api.example.com/login \
        -H "Content-Type: application/json" \
        -d '{"user":"admin","pass":"123"}' | jq -r '.token')
      # 后续请求
      curl -H "Authorization: Bearer $TOKEN" https://api.example.com/protected

💡 安全注意事项(非常重要!)

  1. 永远不要硬编码 Token 到代码中:Token 应存储在环境变量、配置文件(加入 .gitignore)或密码管理器中。
  2. 注意 Token 过期
    • 保存 token 的同时,最好也保存它的 expires_in(过期时间)。
    • 如果过期,脚本应自动尝试刷新 Token(使用 Refresh Token)或提示用户重新登录。
  3. HTTPS 是必须的:在传输和存储过程中,始终使用 HTTPS 加密通信。
  4. 文件权限:如果存储在文件中,确保文件权限设置为仅当前用户可读(Linux: chmod 600 session.json)。
场景 推荐方法 风险等级
浏览器脚本 HttpOnly Cookie(安全)或 localStorage(方便但需防XSS) 中-高
命令行脚本 文件存储 + 环境变量,或 keyring 库 低-中
移动/桌面应用 平台安全存储(iOS Keychain,Android Keystore)
API测试工具 环境变量 + 自动脚本

选择哪种方式取决于你的应用类型安全要求以及是否需要跨会话持久化,对于大多数自动化脚本,将 Token 以 Json 文件形式保存到 .script_cache/ 目录下是最简单且有效的方案。

抱歉,评论功能暂时关闭!