mohand-plugin-otp

概览

MoHand 插件,用以提供根据传入的 secret 返回实时 OTP 密码的功能, 并可以根据用户实际需求进行最终输出密码的再拼接。

基于 pyotp 包做的封装实现,并提供了两个接口,分别为 now()format() 。 后者支持以传入的指定模板&字串返回最终动态密码作为输出。

安装方法

您可以通过 pip 进行安装,本包仅在 Python 3.X 下测试通过:

pip3 install mohand-plugin-otp

提示

v1.0.0 版本开始,增加了对 Python 2.X 的支持,但由于我主要在 Py3 环境下使用,所以强烈建议您在 Py3 下使用。如果您在 Py2 环境下遇到任何异常, 可以及时提 Issues 给我,我会努力在搬砖的间隙进行修复。。。

注解

建议使用 virtualenv 来安装,避免与其他包产生依赖冲突。

如果您感兴趣的话,可以了解下 virtualenvwrapper ,用其来管理虚拟环境可谓丝般顺滑!

使用说明

此插件的使用十分简单,首先您需要拿到您 OTP 的秘钥,一般网站都是通过一个二维码提供的,如下:

_images/chart.png

您可以先使用 Google Authenticator 等工具扫描上述秘钥,将其添加。 然后您可以通过通用的二维码扫描工具获取该二维码的内容为 otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP 然后我们就可以从中找到 secretJBSWY3DPEHPK3PXP

在您的 handfile.py 文件中添加内容如下:

# encoding=utf8
from mohand.hands import hand

@hand.otp(secret='JBSWY3DPEHPK3PXP')
def otp(o):
    """获取动态密码"""
    hand._click.echo(o.now())

然后我们就可以通过 mohand 命令来在终端执行该子命令:

$ mohand
Usage: mohand [OPTIONS] COMMAND [ARGS]...

  通用自动化处理工具

  详情参考 `GitHub <https://github.com/littlemo/mohand>`_

Options:
  --author   作者信息
  --version  版本信息
  --help     Show this message and exit.

Commands:
  otp       获取动态密码

$ mohand otp
218548

此时可以将返回的动态密码与您手机中添加相同秘钥的工具中的密码进行对比,不出意外应该是相同的, 以上即为最基本的使用,如果您对 handfile.py 的使用不是很清楚,可以参见 MoHand 的文档说明。

然而在实际使用时还会有一种需求,即将动态的 OTP 密码与一个指定的 PIN 码进行指定样式的拼接,此时我们就可以使用 format() 接口来方便的实现该需求:

# encoding=utf8
from mohand.hands import hand

@hand.otp(secret='JBSWY3DPEHPK3PXP')
def otp(o):
    """获取动态密码"""
    hand._click.echo(o.format('{pin}{otp}', pin='xxooxx'))

将上述的修改后 otp 方法更新到 handfile.py 文件中,然后我们就可以执行下看看效果:

$ mohand otp
xxooxx513255

这样我们就获取到了一个在 otp 前拼接了一个 pin 的动态密码了。

当然还有更高阶的使用方式,比如大部分的动态密码都是用于网站登录,如果您有频繁的认证需求, 不妨将其 HTTP 请求抓下来,并以模拟请求的方式实现于 handfile.py 中, 如此便可以很便捷的实现动态密码站点的自动登录了,省去了复制粘贴密码的工作。

hand模块

mohand_plugin_otp.hand.otp(*dargs, **dkwargs)[源代码]

将被装饰函数封装为一个 click.core.Command 类,成为 mohand 的子命令

该装饰器被作为一个包含定制其行为的含参数装饰器使用(如: @hand.otp(secret='xxoo')

注解

该装饰器最终会通过插件系统被注册到 hands.hand 中。

此处的 otp 装饰器本身是应该不支持无参数装饰的,但考虑到其作为样例实现, 故将其实现为兼容两种传参的装饰器

参数:
  • log_level (int) – 当前子命令的日志输出等级,默认为: logging.INFO
  • secret (str) – 用于构造基于时间的 OTP 的秘钥字串
返回:

被封装后的函数

返回类型:

function

class mohand_plugin_otp.hand.OTP(secret=None)[源代码]

基类:object

pyotp实例化后的对象封装,支持一系列接口方法

now()[源代码]

获取当前密码

返回:OTP 密码
返回类型:str
format(fmt='{otp}', **kwargs)[源代码]

格式化密码输出,用于应对 OTP 与指定字串进行拼接作为最终密码的场景。 额外提供的格式化参数需要通过 **kwargs 传入

参数:fmt (str) – 格式化模板字串,将会调用其 str.format 方法
返回:格式化后的 OTP 密码
返回类型:str
引发:KeyError – fmt字串中指定的关键字参数未传入造成的格式化失败

发布说明

v1.0.0 (2018-05-27 21:55:10)

Feature

  1. 实现对于 pyotp 的封装,并实现上下文管理器支持,便于最终用户使用
  2. 实现用于获取动态密码的 nowformat 接口
  3. 实现 otp 装饰器并通过 stevedore 接口注册到 mohand