Flask學習 4 server物件(token)

2021-09-26 02:15:06 字數 3228 閱讀 4489

資料加密-sha1

import hashlib

pwd='a123456'

temp=hashlib.sha1(pwd.encode())

print(temp.hexdigest())

hash加鹽加密

from werkzeug.security import generate_password_hash,check_password_hash

def password_hash(str):

method = 'pbkdf2:sha1:2000'

salt_length = 8

str_encode = generate_password_hash(str, method=method, salt_length=salt_length)

return str_encode

def check_password(old_str_hash, new_str):

res = check_password_hash(old_str_hash, new_str)

return res

if __name__ == '__main__':

encodestr = password_hash('123')

print(encodestr)

print(check_password(encodestr, '123'))

jwt基礎

jwt(json web token) 是為了網路應用環境間傳遞宣告而執行的一種基於json的開發標準(rfc 7519)

流程:

1. 使用者使用使用者名稱、密碼請求伺服器

2. 伺服器驗證使用者資訊

3. 伺服器通過驗證傳送給使用者乙個token

4. 客戶端儲存token,並在每次請求時附加這個token值

5. 伺服器驗證token,並返回資料,這個token必須要在每次請求時傳送給伺服器,它應該儲存在請求頭中,另外,伺服器要支援cors(跨**資源共享)策略,一般我們在服務端這麼做就可以了 access-control-allow-origin:*

jwt字串組成:頭部(headers) . 載荷(payload) . 簽證(signature) 【頭部儲存宣告資訊,base64加密;載荷儲存有效資訊option,base64加密;簽證由加密後的headers、加密後的payload、secret組成,然後加密】

安裝

pip install pyjwt -i

封裝token的生成和驗證

service / utils / token_tool.py

import jwt

from datetime import datetime,timedelta

# 私鑰

secret_key = '2019-8-9'

# 過期時間

expire = 180

def make_token(id):

datetimeint = datetime.utcnow() + timedelta(seconds=expire)

# 載荷

option =

token = jwt.encode(option, secret_key, 'hs256')

return token

def check_token(token):

id = none

try:

decoded = jwt.decode(token, secret_key, audience='webkit', algorithms=['hs256'])

id = decoded.get('id')

except jwt.expiredsignatureerror as ese:

print(ese)

except exception as ex:

print(ex)

finally:

return id

利用token_tool.py對使用者進行驗證

service/user_service.py : login時呼叫make_token進行token的生成;show時利用裝飾器呼叫check_token進行token的驗證

@user.route('/login/', methods = ['get', "post"])

def login():

if request.method == 'get':

return 'get...login...'

else:

user = request.get_json()

if user.get('telephone') == '15712345678':

if user.get('password') == '123456':

token = make_token(user.get('telephone'))

return status_code["login_success"],200,

else:

return status_code["password_error"]

else:

return status_code["user_none"]

@user.route('/show/')

@check_login

def show():

uid = request.args.get('id')

return '歡迎{}使用者登入成功'.format(uid)

service/decorate/check_user.py :成功則返回,失敗則跳轉

from functools import wraps

from flask import request,redirect

def check_login(func):

@wraps(func)

print('check..is..ok...')

token = request.headers.get('token')

id = check_token(token)

# print(id)

if id:

return func()

else:

return redirect('/user/login/')

Flask學習筆記(4)

開發環境 win10 vscode python3.7 動態渲染 動態網頁模板渲染 from flask import flask from flask import render template from random import randint def index return render...

學習4 物件轉殖

物件轉殖介面 param param from from param dsttype dsttype return t public static t cloneobject object from,classdsttype catch instantiationexception e catch ...

hibernate學習4 關聯對映 多對一

關聯對映分類 一對一,一對多 多對一 多對多 單向關聯和雙向關聯 單向關聯 多對一 客戶和訂單 資料表 customer id,name,email order id,name,ordernumber,customerid 外來鍵 類customer integer id,string name,s...