Skip to content
Python implementation of the Mobile Authenticator
Find file
Latest commit b24c860 @nakato nakato Document creating QRCode with qrencode on CLI
This is important to the use of external OTP auth applications on
phones, so add documentation to outline it.


Using the command-line tool

bna is a command line interface to the python-bna library. It can store and manage multiple authenticators, as well as create new ones.

Two things to remember:
  • Using an authenticator on the same computer as the one you're playing on is not secure.
  • It is impossible (without knowing the secret) to import an existing authenticator

Configuration is stored in ~/.config/bna/bna.conf. You can pass a different config directory with --config=~/.bna.conf for example.

Creating a new authenticator

$ bna --new

If you do not already have an authenticator, it will be set as default. You can pass --set-default otherwise.

Getting an authentication token

$ bna
$ bna EU-1234-1234-1234

Getting a serial's restore code

$ bna --restore-code
$ bna --restore EU-1234-1234-1234 ABCDE98765
Restored serial EU-1234-1234-1234

OTP from Mobile

$ bna --otpauth-url

Now paste this to your OTP app, or convert to QRCode and scan, or manually enter the secret.

Note: This will not work with "Google Authenticator" as it does not support 8 digits, try "FreeOTP"


To encode to a QRCode on your local system install 'qrencode'

For a PNG file saved to disk

$ bna --otpauth-url | qrencode -o ~/BNA-qrcode.png
# Scan QRCode
$ rm ~/BNA-qrcode.png

Or to attempt ot display QRCode in terminal as text output

$ bna --otpauth-url | qrencode -t ANSI

Using the python-bna library

Requesting a new authenticator

import bna
        # region is EU or US
        # note that EU authenticators are valid in the US, and vice versa
        serial, secret = bna.request_new_serial("US")
except bna.HTTPError as e:
        print("Could not connect:", e)

Getting a token

# Get and print a token
token, time_remaining = bna.get_token(secret=secret)

# print a new token every time the previous one expires
from time import sleep
while True:
        token, time_remaining = bna.get_token(secret=secret)
Something went wrong with that request. Please try again.