测试开发面试题:用户认证token的机制和详细原理

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


Token 是一种用于身份认证的机制。它通常是一个字符串,包含用户的认证信息(可能是加密的),在用户登录后由服务器生成并返回给客户端。客户端在后续的请求中将 Token 附带在请求头或其他位置,服务器通过验证 Token 来确认用户身份。

Token 的使用原理和机制

  1. 登录与生成 Token:

    • 用户通过用户名和密码向服务器发起登录请求。

    • 服务器验证用户身份后,生成一个 Token,并将其返回给客户端。

    • Token 通常包含用户 ID、角色、权限等信息,并使用加密算法进行签名(如 HMAC 或 RSA)。

  2. 客户端携带 Token:

    • 客户端将 Token 保存下来(如存储在浏览器的 localStoragesessionStorage 或 Cookie 中)。

    • 在后续请求中,客户端将 Token 放在请求头(通常是 Authorization: Bearer <token>)中发送给服务器。

  3. 服务器验证 Token:

    • 服务器接收到请求后,解析并验证 Token 的有效性(如检查签名是否正确、是否过期)。

    • 如果 Token 有效,服务器允许访问资源;否则返回错误(如 401 Unauthorized)。

  4. Token 续期:

    • Token 通常设置过期时间(如 1 小时)。

    • 为了保持会话,客户端需要在 Token 过期前向服务器请求新的 Token(称为刷新 Token)。

    • 刷新机制通常依赖于一个长期有效的 Refresh Token

Token 的优点和缺点

优点
  1. 无状态性:
    • Token 是无状态的,服务器不需要存储用户会话信息,适合分布式架构。

  2. 跨平台支持:
    • Token 可以在不同的客户端(如 Web、移动端)中使用。

  3. 灵活性:
    • 可以包含用户的角色、权限等信息,便于权限管理。

  4. 安全性:
    • 使用 HTTPS 和加密签名,可以有效防止篡改和窃取。

缺点
  1. 过期问题:
    • Token 有固定的过期时间,过期后需要重新获取,可能导致用户体验不佳。

  2. 刷新机制复杂:
    • 需要额外设计 Refresh Token 和续期逻辑,增加系统复杂性。

  3. Token 泄露风险:
    • 如果 Token 被窃取,攻击者可以冒充用户,造成安全问题。

  4. Token 长度问题:
    • Token 通常较长,会增加请求的大小,可能对性能造成一定影响。

需要注意的事项

  1. 使用 HTTPS:
    • 确保所有通信通过 HTTPS 加密,防止 Token 被窃听。

  2. 设置合理的过期时间:
    • 短期 Token(如 1 小时)和长期 Refresh Token(如 7 天)结合使用。

  3. Token 存储位置:
    • 避免将 Token 存储在易受攻击的位置(如 localStorage,建议使用 HttpOnly Cookie)。

  4. 刷新机制:
    • 设计 Refresh Token 和短期 Token 的续期逻辑,确保用户体验。

  5. 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)  

代码说明

  1. 生成 Token:
    • 使用 jwt.encode 创建 Token,包含 user_id 和过期时间 (exp)。

  2. 验证 Token:
    • 使用 jwt.decode 验证 Token 的有效性。

    • 如果 Token 过期或无效,会返回相应的错误信息。

  3. 登录接口:
    • 验证用户名和密码后,生成 Token 并返回给客户端。

  4. 受保护接口:
    • 需要客户端在请求头中携带 Token,服务器验证后允许访问。

处理 Token 续期

  1. Refresh Token 概念:

    • 除了短期 Token,还需要一个长期有效的 Refresh Token。

    • 当短期 Token 即将过期时,客户端用 Refresh Token 请求新的短期 Token。

  2. 网络抖动导致续期失败:

    • 客户端可以在短期 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%免费】
在这里插入图片描述​​
在这里插入图片描述​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值