token原理

token是为了防止表单重复提交,token 原理大致为:

1:显示表单的那个 action 中使用 createToken() 生成一个随机的 token值,并存放在服务端(session或者cache中),并且传递一份到页面中

2:表单页面使用一个隐藏表单域获取后端传过来的 token值,该表单页面提交时会将此 token 值一同提交到后端

3:在表单页面提交到的 actioin 中使用 validateToken() 将服务端与表单隐藏域中的 token 值进行对比,如果服务端存在 token值并且与表单提交过来的值相等,证明是第一次提交。

4:每次校验过后服务端的 token 值会立即被清除,所以当用户重复提交时,后面的提交校验都再也无法通过。从而实现了防止重复提交的功能,validateToken 是在 synchronized 块中执行的保障了多线程下的安全性。

后端生成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、付费专栏及课程。

余额充值