Python Flask Restful token验证

服务端:

#!/usr/bin/env python

import os

import time

from flask import Flask, abort, request, jsonify, g, url_for

from flask_sqlalchemy import SQLAlchemy

from flask_httpauth import HTTPBasicAuth

import jwt

from werkzeug.security import generate_password_hash, check_password_hash

# initialization

app = Flask(__name__)

app.config['SECRET_KEY'] = 'the quick brown fox jumps over the lazy dog'

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'

app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

# extensions

db = SQLAlchemy(app)

auth = HTTPBasicAuth()

class User(db.Model):

__tablename__ = 'users'

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(32), index=True)

password_hash = db.Column(db.String(128))

def hash_password(self, password):

self.password_hash = generate_password_hash(password)

def verify_password(self, password):

return check_password_hash(self.password_hash, password)

def generate_auth_token(self, expires_in=600):

return jwt.encode(

{'id': self.id, 'exp': time.time() + expires_in},

app.config['SECRET_KEY'], algorithm='HS256')

@staticmethod

def verify_auth_token(token):

try:

data = jwt.decode(token, app.config['SECRET_KEY'],

algorithms=['HS256'])

except:

return

return User.query.get(data['id'])

@auth.verify_password

def verify_password(username_or_token, password):

# first try to authenticate by token

user = User.verify_auth_token(username_or_token)

if not user:

# try to authenticate with username/password

user = User.query.filter_by(username=username_or_token).first()

if not user or not user.verify_password(password):

return False

g.user = user

return True

@app.route('/api/users', methods=['POST'])

def new_user():

username = request.json.get('username')

password = request.json.get('password')

if username is None or password is None:

abort(400)    # missing arguments

if User.query.filter_by(username=username).first() is not None:

abort(400)    # existing user

user = User(username=username)

user.hash_password(password)

db.session.add(user)

db.session.commit()

return (jsonify({'username': user.username}), 201,

{'Location': url_for('get_user', id=user.id, _external=True)})

@app.route('/api/users/<int:id>')

def get_user(id):

user = User.query.get(id)

if not user:

abort(400)

return jsonify({'username': user.username})

@app.route('/api/token')

@auth.login_required

def get_auth_token():

token = g.user.generate_auth_token(600)

return jsonify({'token': token, 'duration': 600})

@app.route('/api/resource')

@auth.login_required

def get_resource():

return jsonify({'data': 'Hello, %s!' % g.user.username})

@app.route('/api/hello')

def sayhello():

return "hello,jcstone"

if __name__ == '__main__':

if not os.path.exists('db.sqlite'):

db.create_all()

app.run(debug=True)

客户端:

import requests, base64

import json

urltoken = "http://127.0.0.1:5000/api/token"

payload = {}

name = "jcstone"

pwd = "123456"

# auth = str(base64.b64encode(f'{name}:{pwd}'.encode('utf-8')), 'utf-8')

# headers = {

#     'Content-Type': 'application/json',

#     'Authorization': 'Basic %s' % auth

# }

# response = requests.request("GET", urltoken, headers=headers, data=payload)

# 获取token

headers = {'Content-Type': 'application/json'}

response = requests.get(urltoken, auth=(name, pwd),headers=headers, data=payload)

reptokens = json.loads(response.text.encode('utf8'))

print(reptokens["token"])

# 利用token验证访问restful api

urlapi = 'http://127.0.0.1:5000/api/resource'

token = reptokens["token"]

headers = {

# 将User-Agent改成 Chrome 浏览器

'User-Agent':

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',

}

response = requests.get(urlapi, auth=(token, ''), headers=headers)

print(response.text.encode('utf8'))

(0)

相关推荐

  • 初识Flask

    大邓细数了我的文章,近60篇文章中只有一篇写 微信聊天机器人使用了装饰器.大家不必担心学 不会装饰器肿么办.类学不会怎么办这类问题.Python中 类. 装饰器都属于锦上添花之物,解决的是1和还是1+ ...

  • flask基础学习一

    源码: from flask import Flask,redirect,url_for app = Flask(__name__) @app.route("/home") def ...

  • Python Flask 开发 web 指南01之创建你的第一个 RESTful APP

    上回,我们知道了 Flask 是一个 web 轻量级框架,可以在上面做一些扩展,我们还用 Flask 创建了 API,也说到了 REST API,今天咱们来玩一下 Flask-RESTful,体验一下 ...

  • python flask介绍

    与django等网络框架一样flask同样是非常友好,值得关注的网络框架 一个最小的应用 一个最小的 Flask 应用如下: from flask import Flask app = Flask(_ ...

  • Python Flask 数据可视化

    数据可视化是数据处理中的重要部分,前面我们了解了 Flask 的开发和部署,如何用 Flask 做数据可视化呢?今天我们来了解一下. Python 语言极富表达力,并且拥有众多的数据分析库和框架,是数 ...

  • python测试开发django-102.验证时form表单error_messages

    前言 form表单验证前端输入内容是否合法时,可以定义error_messages参数,用于前端页面展示错误信息 error_messages参数 LoginForm 表单添加 常用的error_me ...

  • 快速创建Flask Restful API项目

    快速创建Flask Restful API项目 前言 Python必学的两大web框架之一Flask,俗称微框架.它只需要一个文件,几行代码就可以完成一个简单的http请求服务. 但是我们需要用fla ...

  • Python Flask 开发网络应用指南00:创建你的 REST API

    后台有些朋友希望我写一写 Python 后台开发相关的,那么就来写几篇关于 Flask 的使用吧,把你们比较想知道的一些东东说一下,比如怎么使用 Flask 来创建 API,如何使用好 Flask-R ...

  • Python 里最强的Web框架,早就不是Django和Flask了

    Python 里最强的Web框架,早就不是Django和Flask了

  • Python实战案例:flask结合elasticsearch实现全文搜索

    ElasticSearch简称ES,其中Elastic一词通过词典查询获得. 从名字里我们可以知道,ES的特点就在于灵活的搜索,其实ES本身就是一个全文搜索引擎. 一.全文搜索原理 如何实现全文搜索? ...

  • C# 启动 Flask for Python

    概览 最近有个需求是通过c#代码来启动 python 脚本.嘿~嘿!!! 突发奇想~~既然可以启动 python 脚本,那也能启动 flask,于是开始着手操作. 先看gif图 准备 因为使用的是.N ...