本文目录导读:

- 浏览器脚本(JavaScript/Chrome扩展等)
- 命令行脚本(Python/Bash/Node.js)
- HTTP API 客户端脚本(curl/Postman/Insomnia)
- 💡 安全注意事项(非常重要!)
保存登录状态的核心思路是在客户端安全地存储凭证,并在后续请求中自动携带,根据你的应用类型(浏览器网页、移动App、命令行脚本),实现方式有所不同。
以下是三种主流场景的详细方案:
浏览器脚本(JavaScript/Chrome扩展等)
使用 localStorage 或 sessionStorage(最常用)
- 原理:登录成功后,服务器返回一个 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/文本)
- 登录:发出请求,获取 Token。
- 保存:将 Token 写入本地文件(如
session.json)。 - 复用:每次发出请求前,读取文件,将 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
-
💡 安全注意事项(非常重要!)
- 永远不要硬编码 Token 到代码中:Token 应存储在环境变量、配置文件(加入
.gitignore)或密码管理器中。 - 注意 Token 过期:
- 保存
token的同时,最好也保存它的expires_in(过期时间)。 - 如果过期,脚本应自动尝试刷新 Token(使用 Refresh Token)或提示用户重新登录。
- 保存
- HTTPS 是必须的:在传输和存储过程中,始终使用 HTTPS 加密通信。
- 文件权限:如果存储在文件中,确保文件权限设置为仅当前用户可读(Linux:
chmod 600 session.json)。
| 场景 | 推荐方法 | 风险等级 |
|---|---|---|
| 浏览器脚本 | HttpOnly Cookie(安全)或 localStorage(方便但需防XSS) | 中-高 |
| 命令行脚本 | 文件存储 + 环境变量,或 keyring 库 | 低-中 |
| 移动/桌面应用 | 平台安全存储(iOS Keychain,Android Keystore) | 低 |
| API测试工具 | 环境变量 + 自动脚本 | 低 |
选择哪种方式取决于你的应用类型、安全要求以及是否需要跨会话持久化,对于大多数自动化脚本,将 Token 以 Json 文件形式保存到 .script_cache/ 目录下是最简单且有效的方案。