翼度科技»论坛 编程开发 python 查看内容

Python中的google authenticator认证过程

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
Python的google authenticator认证


环境描述


  • python 3.7
  • 所需安装包 :
  • pyotp qrcode Image

实现原理


  • 使用pyotp 的python模块生成google auth 需要的密钥
  • 根据密钥生成条形码图片
  • 使用google authenticator 客户端扫描条形码,客户端根据时间及密钥经过算法 生成6位数的验证码
  • 平台二次认证通过对输入的验证码进行校验,校验也是基于时间和密钥

代码实现
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Author : SLP
  4. # @Time : 2021/10/3 10:25

  5. import os
  6. import traceback
  7. import pyotp
  8. from qrcode import QRCode, constants


  9. class GoogleAuthenticatorClient:
  10.     def __init__(self, secret_key=None):
  11.         self.secret_key = secret_key

  12.     def create_secret(self):
  13.         """
  14.         生成google auth 需要的密钥
  15.         :return:
  16.         """
  17.         self.secret_key = pyotp.random_base32(64)
  18.         return self.secret_key

  19.     def create_secret_qrcode(self, name=None, issuer_name=None, save_to_file=True):
  20.         """
  21.         根据用户名及密钥生成二维码图片
  22.         :param name:用户名
  23.         :param issuer_name:发行人
  24.         :param save_to_file: 保存至文件
  25.         :return:
  26.         """
  27.         data = pyotp.totp.TOTP(self.secret_key).provisioning_uri(name=name, issuer_name=issuer_name)
  28.         qr = QRCode(
  29.             version=1,
  30.             error_correction=constants.ERROR_CORRECT_L,
  31.             box_size=6,
  32.             border=4, )
  33.         try:
  34.             qr.add_data(data)
  35.             qr.make(fit=True)
  36.             img = qr.make_image()
  37.             if save_to_file:
  38.                 base_dir = os.path.dirname(os.path.abspath(__file__))
  39.                 dir_path = os.path.join(base_dir, 'static', 'image')
  40.                 if not os.path.exists(dir_path):
  41.                     os.makedirs(dir_path)
  42.                 filepath = dir_path + os.sep + self.secret_key + '.png'
  43.                 img.save(filepath)  # 保存条形码图片
  44.                 return True, filepath
  45.             else:
  46.                 return img.get_image()
  47.         except Exception as e:
  48.             traceback.print_exc()
  49.             return False, None

  50.     def verify_code_func(self, verify_code):
  51.         t = pyotp.TOTP(self.secret_key)
  52.         result = t.verify(verify_code)
  53.         return result


  54. if __name__ == '__main__':
  55.     secret_key = 'PU6PY6FWPVQ4BXE7ZP6X7YMVM3BH3ODS7SW53GL3LJPED7AAQUVF2EKP6AGNFFOX'
  56.     google_auth_ = GoogleAuthenticatorClient(secret_key=secret_key)
  57.     # secret = google_auth_.create_secret()
  58.     # print('秘钥', secret)
  59.     # # 生成图片二维码
  60.     image = google_auth_.create_secret_qrcode(name='slp', issuer_name='GoldBull', save_to_file=False)
  61.     print(image.show())

  62.     # 验证
  63.     # res = google_auth_.verify_code_func(verify_code='635543')
  64.     # print(res)
复制代码
总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:https://www.jb51.net/python/331227sfi.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具