使用 python 編寫一個授權登錄驗證的模塊


使用 python 編寫一個授權登錄驗證的模塊

我們編寫的思路:
1、登錄的邏輯:如果用戶名和密碼正確,就返回 token 。
2、生成 token 的邏輯,根據用戶名,隨機數,當前時間 + 2 小時
3、然后放在 users 中密碼的后面,每次都不一樣
4、驗證 token 的步驟,取出以后,解碼
得到用戶名,去和 users 中的 token 比較,(只會和最近的 token 比較,之前的不比較,也就是之前的失效了)
然后再驗證是否過期。

源代碼:

from flask import Flask, request, redirect

import base64
import random
import time

app = Flask(__name__)

users = {
    "liwei": ["123456"],
    "zhouguang": ["888888"]
}


def getToken(uid):
    s1 = ':'.join([str(uid), str(random.random()), str(time.time() + 7200)])
    s2 = base64.b64encode(s1)
    users[uid].append(s2)
    print users[uid]
    return s2

@app.route("/login", methods=['GET', 'POST'])
def login():
    uid, pwd = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).split(':')

    if users[uid][0] == pwd:
        return getToken(uid)
    else:
        return 'error'
    return 'OK'

def verify_token(token):
    _token = base64.b64decode(token)
    if not users.get(_token.split(':')[0])[-1] == token:
        return -1
    if float(_token.split(':')[-1]) >= time.time():
        return 1
    else:
        return 0

@app.route("/getResource", methods=['GET', 'POST'])
def getResource():
    token = request.args.get('token')
    print token
    if verify_token(token) == 1:
        return 'data'
    else:
        return 'error'

if __name__ == '__main__':
    app.run()

關於源代碼的說明:

導入這三個模塊 from 和 import 分別是什么意思呢?

from flask import Flask, request, redirect

import random
import base64
import time

這句話比較重要,不要忘記了

app = Flask(__name__)

從請求頭中獲得數據應該這樣寫 [Authorization]

authorization = request.headers['Authorization'];
userAndPasswd = authorization.split(' ')[-1]
print userAndPasswd

user = base64.b64decode(userAndPasswd).split(":")[0]
passwd = base64.b64decode(userAndPasswd).split(":")[1]

鍵值對

users ={
    "liwei":["123456"],
    "zhouguang":["888888"]
}

說明:獲取的時候 users["liwei"]users.get("liwei") 都可以。

留意下面這種寫法,同時賦值

uid,pwd = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).split(':')

元組后面添加元素

users[uid].append(token)

字符串連接的方法,時間類

token = base64.b64encode(":".join([str(uid),str(random.random()),str(time.time() + 7200)]))

寫一個占位符 pass

def verify_token(token):
    pass

restful 風格的 url 這樣寫

@app.route("/index/<user>", methods=['POST'])
def hello_world(user):
    print('hello %s' % user)
    print request.headers
    return '%s ,welcome' % user

重定向這樣寫,要記得引入 redirect 模塊

@app.route("/client/login", methods=['POST', 'GET'])
def client_login():
    uri = 'http://localhost:5000/oauth'
    return redirect(uri)

獲得請求參數

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM