Python的google authenticator认证
环境描述
- python 3.7
- 所需安装包 :
- pyotp qrcode Image
实现原理
- 使用pyotp 的python模块生成google auth 需要的密钥
- 根据密钥生成条形码图片
- 使用google authenticator 客户端扫描条形码,客户端根据时间及密钥经过算法 生成6位数的验证码
- 平台二次认证通过对输入的验证码进行校验,校验也是基于时间和密钥
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #!/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) |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。