Python flask之token相关知识及HTTPBasicAuth的使用

目录

1、网站的用户登录流程:

2、API的用户流程:

3、token令牌的三个基本特征

4、代码实现

5、令牌的使用思路

6、编写验证token的装饰器

7、使用HTTPBasicAuth的方式发送账号密码

8、通过HTTPBasicAuth的方式发送token

9、验证token

验证token是否合法:

验证令牌是否过期:

读取令牌信息:

10、关于8和9的代码总览


下面的配置放在xxx.py文件中,而且conf文件夹是一个python的包文件,在IDEA中的图标是

COOKIE_EXPIRATION = 30 * 24 * 3600  # 秒(到期浏览器自动删除)
TOKEN_EXPIRATION = 30 * 24 * 3600  # 秒(到期报错SignatureExpired)
USERNAME = 'zhangsan'
PASSWORD = 'lisi'
SECRET_KEY = 'k#6@1%8)a'

 

from flask import request, jsonify, Flask, make_response, flash
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
from flask_httpauth import HTTPBasicAuth
from commonUtils import _get_parameters

app = Flask(__name__)
app.config.from_object('conf.secure')  # 注意这里的路径要相对于flask核心对象的__name__来写相当路径
app.config.from_object('conf.setting')

auth = HTTPBasicAuth()


@app.route('/generate_token')
def generate_auth_token():
    """生成token令牌"""
    s = Serializer(app.config['SECRET_KEY'], expires_in=app.config['TOKEN_EXPIRATION'])
    temp = s.dumps({app.config['USERNAME']: app.config['PASSWORD']})

    # date = datetime.datetime.today() + datetime.timedelta(days=app.config['COOKIE_EXPIRATION'])
    response = make_response()
    response.set_cookie(temp, '', max_age=app.config['COOKIE_EXPIRATION'])

    return response  # eyJhbGciOiJIUzUxMiIsImlhdCI6MTU1MDIxNDUzNiwiZXhwIjoxNTUyODA2NTM2fQ.eyJpZCI6InpoYW5nc2FuIn0.c30V7Cid1_5s5QAj9-cQCDmLg1xbup41PsY99iVtX2D52r_we7cvja7KOl0MOILjWTQ3M3FlhBO6TgIwFI_H5g


@auth.verify_password
def verify_auth_token(token, password):  # 注意只能两个参数
    """验证token"""
    s = Serializer(app.config['SECRET_KEY'])
    try:
        data = s.loads(token)  # {'id': 'zhangsan'}
    except SignatureExpired:
        raise SignatureExpired('令牌已过期')
    except BadSignature:
        raise BadSignature('令牌不合法')
    if data.get(app.config['USERNAME']) == app.config['PASSWORD']:
        return True
    else:
        return False


@app.route('/')
@auth.login_required  # 通过Authorization value=token:''
def index():
    return "hello"

1、网站的用户登录流程:

  • 在网页中登录需要提供用户的身份信息(账号、密码)然后发送到网页后端之后,如果网页后端验证账号密码是正确的,它将把一个票据写入到cookie中,最后再把这个cookie返回到浏览器中,并且由浏览器存储住这个cookie,那么下一次我们使用浏览器访问我们的网站的时候呢,就不在需要登录了,因为浏览器有存储我们用户的票据,这个票据就是用户的一个身份标识,只要携带这个票据网页就会认为此次访问是合法的。

2、API的用户流程:

API的访问流程和网页是差不多的,不一样的是,第一我们不一定是使用网页去访问API,我们可以由小程序app甚至是Postman都可以去访问API,其次我们不一定是由浏览器去访问的,所以不一定有cookie,我们就没办法把票据保存在cookie中了。

和右边是差不多的,唯一的区别在API验证了用户的账号和密码之后,它会返回一个token,token我们叫做令牌,令牌简单理解呢就是一个加密的字符串,那么API把令牌返回给我们的客户端之后,客户端要做的一个事情就是,他必须自己去管理和存储这个token,不在是像我们之前利用浏览器的cookie的机制来存储用户的身份了。客户端存储令牌的方式有很多种,根据不同的客户端机制有不同的存储方式,比如我们的小程序就是把token存储在storag

要在 Flask 中实现 Token 机制,可以使用 JWT(JSON Web Tokens)库。下面是一个简单的示例代码: ```python from flask import Flask, request from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' app.config['JWT_EXPIRATION_DELTA'] = timedelta(days=1) class User: def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}')" users = [ User(1, 'user1', 'password1'), User(2, 'user2', 'password2'), ] def authenticate(username, password): user = next((user for user in users if user.username == username), None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return next((user for user in users if user.id == user_id), None) jwt = JWT(app, authenticate, identity) @app.route('/protected') @jwt_required() def protected(): return f'Hello, {current_identity}!' if __name__ == '__main__': app.run() ``` 在上面的代码中,我们首先定义了一个 `User` 类来存储用户信息。然后定义了一个 `authenticate` 函数来用于用户认证,它会查找用户列表中是否存在指定的用户名和密码。如果存在,则返回该用户对象。 接下来,我们定义了一个 `identity` 函数,它会根据 JWT 中存储的用户 ID 来查找用户对象。最后,我们创建了一个 `jwt` 对象,并将其绑定到 Flask 中。 最后,我们定义了一个受保护的路由 `/protected`,并使用 `@jwt_required()` 装饰器来保护它。这意味着在访问该路由时,用户必须先提供有效的 JWT 才能继续访问。 当用户成功提供有效的 JWT 且通过身份验证时,`current_identity` 会返回该用户对象,我们可以在响应中使用它。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值