python的google authenticator认证
环境描述
- python 3.7
- 所需安装包 :
- pyotp qrcode image
实现原理
- 使用pyotp 的python模块生成google auth 需要的密钥
- 根据密钥生成条形码图片
- 使用google authenticator 客户端扫描条形码,客户端根据时间及密钥经过算法 生成6位数的验证码
- 平台二次认证通过对输入的验证码进行校验,校验也是基于时间和密钥
代码实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author : slp
# @time : 2021/10/3 10:25
import os
import traceback
import pyotp
from qrcode import qrcode, constants
class googleauthenticatorclient:
def __init__(self, secret_key=none):
self.secret_key = secret_key
def create_secret(self):
"""
生成google auth 需要的密钥
:return:
"""
self.secret_key = pyotp.random_base32(64)
return self.secret_key
def create_secret_qrcode(self, name=none, issuer_name=none, save_to_file=true):
"""
根据用户名及密钥生成二维码图片
:param name:用户名
:param issuer_name:发行人
:param save_to_file: 保存至文件
:return:
"""
data = pyotp.totp.totp(self.secret_key).provisioning_uri(name=name, issuer_name=issuer_name)
qr = qrcode(
version=1,
error_correction=constants.error_correct_l,
box_size=6,
border=4, )
try:
qr.add_data(data)
qr.make(fit=true)
img = qr.make_image()
if save_to_file:
base_dir = os.path.dirname(os.path.abspath(__file__))
dir_path = os.path.join(base_dir, 'static', 'image')
if not os.path.exists(dir_path):
os.makedirs(dir_path)
filepath = dir_path + os.sep + self.secret_key + '.png'
img.save(filepath) # 保存条形码图片
return true, filepath
else:
return img.get_image()
except exception as e:
traceback.print_exc()
return false, none
def verify_code_func(self, verify_code):
t = pyotp.totp(self.secret_key)
result = t.verify(verify_code)
return result
if __name__ == '__main__':
secret_key = 'pu6py6fwpvq4bxe7zp6x7ymvm3bh3ods7sw53gl3ljped7aaquvf2ekp6agnffox'
google_auth_ = googleauthenticatorclient(secret_key=secret_key)
# secret = google_auth_.create_secret()
# print('秘钥', secret)
# # 生成图片二维码
image = google_auth_.create_secret_qrcode(name='slp', issuer_name='goldbull', save_to_file=false)
print(image.show())
# 验证
# res = google_auth_.verify_code_func(verify_code='635543')
# print(res)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论