📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
Token 是一种用于身份认证的机制。它通常是一个字符串,包含用户的认证信息(可能是加密的),在用户登录后由服务器生成并返回给客户端。客户端在后续的请求中将 Token 附带在请求头或其他位置,服务器通过验证 Token 来确认用户身份。
Token 的使用原理和机制
-
登录与生成 Token:
-
用户通过用户名和密码向服务器发起登录请求。
-
服务器验证用户身份后,生成一个 Token,并将其返回给客户端。
-
Token 通常包含用户 ID、角色、权限等信息,并使用加密算法进行签名(如 HMAC 或 RSA)。
-
-
客户端携带 Token:
-
客户端将 Token 保存下来(如存储在浏览器的
localStorage
、sessionStorage
或 Cookie 中)。 -
在后续请求中,客户端将 Token 放在请求头(通常是
Authorization: Bearer <token>
)中发送给服务器。
-
-
服务器验证 Token:
-
服务器接收到请求后,解析并验证 Token 的有效性(如检查签名是否正确、是否过期)。
-
如果 Token 有效,服务器允许访问资源;否则返回错误(如 401 Unauthorized)。
-
-
Token 续期:
-
Token 通常设置过期时间(如 1 小时)。
-
为了保持会话,客户端需要在 Token 过期前向服务器请求新的 Token(称为刷新 Token)。
-
刷新机制通常依赖于一个长期有效的 Refresh Token。
-
Token 的优点和缺点
优点
- 无状态性:
-
Token 是无状态的,服务器不需要存储用户会话信息,适合分布式架构。
-
- 跨平台支持:
-
Token 可以在不同的客户端(如 Web、移动端)中使用。
-
- 灵活性:
-
可以包含用户的角色、权限等信息,便于权限管理。
-
- 安全性:
-
使用 HTTPS 和加密签名,可以有效防止篡改和窃取。
-
缺点
- 过期问题:
-
Token 有固定的过期时间,过期后需要重新获取,可能导致用户体验不佳。
-
- 刷新机制复杂:
-
需要额外设计 Refresh Token 和续期逻辑,增加系统复杂性。
-
- Token 泄露风险:
-
如果 Token 被窃取,攻击者可以冒充用户,造成安全问题。
-
- Token 长度问题:
-
Token 通常较长,会增加请求的大小,可能对性能造成一定影响。
-
需要注意的事项
- 使用 HTTPS:
-
确保所有通信通过 HTTPS 加密,防止 Token 被窃听。
-
- 设置合理的过期时间:
-
短期 Token(如 1 小时)和长期 Refresh Token(如 7 天)结合使用。
-
- Token 存储位置:
-
避免将 Token 存储在易受攻击的位置(如
localStorage
,建议使用 HttpOnly Cookie)。
-
- 刷新机制:
-
设计 Refresh Token 和短期 Token 的续期逻辑,确保用户体验。
-
- Token 黑名单:
-
如果用户登出或 Token 泄露,可以将 Token 加入黑名单,防止滥用。
-
Python 实现示例
以下是一个基于 Python 的简单 Token 认证示例,使用了 jwt
(JSON Web Token)库。
安装依赖:
pip install pyjwt flask
使用python的flask框架实现 token 示例代码:
import jwt
import datetime
from flask import Flask, request, jsonify
app = Flask(__name__)
# Secret key for signing tokens
SECRET_KEY = "your_secret_key"
# Generate a token
def generate_token(user_id):
payload = {
"user_id": user_id,
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1), # Token expiration time (1 hour)
"iat": datetime.datetime.utcnow() # Token issue time
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
return token
# Verify a token
def verify_token(token):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return payload
except jwt.ExpiredSignatureError:
return {"error": "Token expired"}
except jwt.InvalidTokenError:
return {"error": "Invalid token"}
# Login route
@app.route("/login", methods=["POST"])
def login():
data = request.json
username = data.get("username")
password = data.get("password")
# Dummy user validation
if username == "admin" and password == "password":
token = generate_token(user_id=1)
return jsonify({"token": token})
else:
return jsonify({"error": "Invalid credentials"}), 401
# Protected route
@app.route("/protected", methods=["GET"])
def protected():
token = request.headers.get("Authorization")
if not token:
return jsonify({"error": "Token is missing"}), 401
# Remove "Bearer " prefix if present
token = token.replace("Bearer ", "")
# Verify token
result = verify_token(token)
if "error" in result:
return jsonify(result), 401
return jsonify({"message": "Welcome!", "user_id": result["user_id"]})
if __name__ == "__main__":
app.run(debug=True)
代码说明
- 生成 Token:
-
使用
jwt.encode
创建 Token,包含user_id
和过期时间 (exp
)。
-
- 验证 Token:
-
使用
jwt.decode
验证 Token 的有效性。 -
如果 Token 过期或无效,会返回相应的错误信息。
-
- 登录接口:
-
验证用户名和密码后,生成 Token 并返回给客户端。
-
- 受保护接口:
-
需要客户端在请求头中携带 Token,服务器验证后允许访问。
-
处理 Token 续期
-
Refresh Token 概念:
-
除了短期 Token,还需要一个长期有效的 Refresh Token。
-
当短期 Token 即将过期时,客户端用 Refresh Token 请求新的短期 Token。
-
-
网络抖动导致续期失败:
-
客户端可以在短期 Token 过期后,尝试用 Refresh Token 再次获取新 Token。
-
如果 Refresh Token 也失效,用户需要重新登录。
-
示例:刷新 Token 的逻辑
@app.route("/refresh", methods=["POST"])
def refresh_token():
refresh_token = request.json.get("refresh_token")
# Dummy validation for Refresh Token
if refresh_token == "valid_refresh_token":
new_token = generate_token(user_id=1)
return jsonify({"token": new_token})
else:
return jsonify({"error": "Invalid refresh token"}), 401
通过以上示例,你可以理解 Token 的工作原理,并根据实际需求设计更复杂的认证机制(如加入角色权限管理、黑名单等)。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】