admin管理员组文章数量:1535319
2024年2月15日发(作者:)
Flask用户名密码登录获取token
原创jcstone
一、服务端
利用Flask-HTTPAuth的Basic对用户名进行密码认证,获取token,然后提供token验证的接口范例
# 简单的用户名密码登录获取token的方式
import logging
from flask import Flask, request, g, make_response, jsonify
from flask_httpauth import HTTPBasicAuth, HTTPTokenAuth
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
# from flask_restful import Api, Resource
app = Flask(__name__)
# 用户名密码方式认证,仅用于登录
basic_auth = HTTPBasicAuth()
# Token方式认证
token_auth = HTTPTokenAuth(schem
e="Bearer")
users = [
{'username': 'Tom', 'password': '111111'},
{'username': 'Michael', 'password': '123456'}
]
# 用户登录后的token字典
# tokens={'id1': 'token1', 'id2': 'token2','id3': 'token3'}
tokens = {}
# 定义token加密、过期时间、盐SALT。例如SECRET_KEY="很长的一段密码" TOKEN_EXPIRATION=7200(为了验证有效期设为30秒) SALT= "我加的盐"
SECRET_KEY = "很长的一段密码"
TOKEN_EXPIRATION = 30
SALT = "我加的盐"
# token序列化签名方法
token_serializer = Serializer(SECRET_KEY, TOKEN_EXPIRATION)
# 创建token ,将生成的token添加到tokens列表中,这里用户名为id。如用户id存在,则更新token,旧token失效,不存在则生成新token,添加到tokens字典中
# 验证用户名密码是否正确
@basic__password
def get_password(username):
for user in users:
if user['username'] == username:
return user['password']
return None
'''
# 登录成功返回成功信息,data中包含token(basic_auth仅用于登录)
# PostMan中调试Authorization中选择Basic Auth,输入用户名密码。
# curl --location --request POST '127.0.0.1:5000/login' --header 'Authorization: Basic VG9tOjExMTExMQ=='
# 登录通过后根据用户名生成token
'''
@('/login', methods=['POST'])
@basic__required
def index():
token = create_token(basic_me())
return jsonify({'code': 1, 'msg': 'success', 'data': token})
# 登录失败返回错误信息(basic_auth仅用于登录,实际包含error_handler所有basic_auth认证错误)
@basic__handler
def errornamepaswoed():
return make_response(jsonify({'code': 0, 'msg': 'Failed', 'data': '错误的用户名或密码'}), 401)
def create_token(username):
token = token_({'username': username}, SALT)
(token)
tokens[username] = token
return ('ascii')
# token 认证
# token loads后解析的是签名字典 {'username': 'Tom'},经过时效和错误签名验证后,检查当前用户名data['username']——即Tom是否在tokens字典中。Tom为示例用户名。
# 除用户名外,可以更多的签名,create_token生成token的签名(字典)和验证比较的签名要一致
@token__token
def verify_token(token):
= None
(token)
try:
data = token_(token, SALT)
except SignatureExpired:
('SignatureExpired')
return False # valid token, but expired
except BadSignature:
('BadSignature')
return False # invalid token
except:
return False
(data)
if 'username' in data:
("data['username']:"+data['username'])
if data['username'] in tokens:
= data['username']
return True
else:
return False
@token__handler
def errortoken_auth():
return make_response(jsonify({'code': 0, 'msg': 'Failed', 'data': '令牌无效'}), 401)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
# token接口范例
@('/tasks', methods=['GET'])
@token__required
def get_tasks():
return jsonify({'tasks': tasks})
if __name__ == "__main__":
(debug=True)
handler = ndler('', encoding='UTF-8')
el()
logging_format = ter(
'%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(
message)s')
matter(logging_format)
dler(handler)
二、客户端
import requests
from import HTTPBasicAuth
import json
url = '127.0.0.1:5000/login'
resp = (url, auth=HTTPBasicAuth('Tom', '111111'))
print(_code)
print()
body = ()
token = body["data"]
print(token)
taskurl = "127.0.0.1:5000/tasks"
payload = {}
headers = {
'Authorization': 'Bearer '+token
}
response = t("GET", taskurl, headers=headers, data=payload)
print(('utf8'))
版权声明:本文标题:Flask用户名密码登录获取token 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1707953347a210964.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论