Python中的google authenticator认证过程
作者:slp_44777680
文章介绍了使用Python 3.7生成Google Authenticator所需密钥的步骤,包括使用pyotp模块生成密钥、生成二维码图片以及通过客户端扫描二维码进行二次认证的实现原理
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)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。