Token原理

权限验证

通过token获取用户的role,动态根据用户的role算出其相应有权限的路由,通过router.addRoutes动态挂载路由。

登录

当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个user_info的接口来获取用户的详细信息(如用户权限,用户名等等信息)。


  • 第一次认证:第一次登录,用户从浏览器输入用户名/密码,提交后到服务器的登录处理的Action层(Login Action);
  • Login Action调用认证服务进行用户名密码认证,如果认证通过,Login Action层调用用户信息服务获取用户信息(包括完整的用户信息及对应权限信息);
  • 返回用户信息后,Login Action从配置文件中获取Token签名生成的秘钥信息,进行Token的生成;
  • 生成Token的过程中可以调用第三方的JWT Lib生成签名后的JWT数据;
  • 完成JWT数据签名后,将其设置到COOKIE对象中,并重定向到首页,完成登录过程;
    image

用户输入

graph LR
用户输入账号密码-->用户名密码验证
用户名密码验证-->验证成功返回用户信息
验证成功返回用户信息-->利用库中的token秘钥信息生成token
利用库中的token秘钥信息生成token-->将token存储在cookie对象中
后端生成token原理主要涉及以下几个步骤: 1. **用户认证**:用户通过提供用户名和密码等信息进行登录,后端验证这些信息的有效性。 2. **生成token**:一旦用户通过认证,后端会生成一个唯一的tokentoken通常是一个包含用户信息和过期时间的字符串。 3. **签名token**:为了防止token被篡改,后端会使用一个密钥对token进行签名。常见的签名算法有HMAC、RS256等。 4. **返回token**:签名的token会返回给客户端,通常通过HTTP响应头或响应体返回。 5. **存储token**:客户端接收到token后,通常会将其存储在本地存储(如localStorage)或cookie中。 6. **验证token**:每次客户端发送请求时,都会带上token。后端接收到请求后,会验证token的签名和有效性,确认token未被篡改且未过期。 7. **授权访问**:验证通过后,后端会根据token中包含的用户信息进行授权,允许用户访问相应的资源。 ### 详细步骤 1. **用户认证**: ```python def authenticate_user(username, password): user = User.query.filter_by(username=username).first() if user and user.check_password(password): return user return None ``` 2. **生成token**: ```python import jwt from datetime import datetime, timedelta def generate_token(user): payload = { 'user_id': user.id, 'exp': datetime.utcnow() + timedelta(hours=1) } token = jwt.encode(payload, 'secret_key', algorithm='HS256') return token ``` 3. **签名token**: ```python token = jwt.encode(payload, 'secret_key', algorithm='HS256') ``` 4. **返回token**: ```python return jsonify({'token': token}), 200 ``` 5. **存储token**: ```javascript localStorage.setItem('token', token); ``` 6. **验证token**: ```python def verify_token(token): try: payload = jwt.decode(token, 'secret_key', algorithms=['HS256']) return payload except jwt.ExpiredSignatureError: return None except jwt.InvalidTokenError: return None ``` 7. **授权访问**: ```python def authorize_request(request): token = request.headers.get('Authorization') payload = verify_token(token) if payload: user_id = payload['user_id'] user = User.query.get(user_id) return user return None ``` 通过以上步骤,后端可以安全地生成和验证token,从而实现用户认证和授权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值