Package: yubival
YubivalThis Django app runs a standalone Yubikey OTP validation server. It implementsversion 2.0 of the validation protocollimited to the case of a single validation server. YubiKey devices and server API keys can easily be managed in the Django admin site or via command line.InstallationYubival can be integrated to any existing Django project. Alternatively, you can create a new Django site to host your validation server. If unfamiliar with Django, please follow the instructions at "Create a new standalone validation server" below.Add Yubival to an existing Django projectInstall the package from PyPI:$ pip install yubivalAdd'yubival'to theINSTALLED_APPSsetting in settings.py. It is not required to enable the admin site. If you do,INSTALLED_APPSmay look like:INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'yubival',
]Add the app URLs to the root urls.py file:from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    # ...
    path('admin/', admin.site.urls),  # optional
    path('', include('yubival.urls')),
]Update the database:python manage.py migrateWhen running the server, you should now be able to query the API at/wsapi/2.0/verify. When not providing any GET parameters, this returns aMISSING_PARAMETERstatus:t=2021-10-29T08:31:11.885803
status=MISSING_PARAMETERCreate a new standalone validation serverThis section explains how to setup a new Django site with Yubival. It was tested on a Debian 10 distribution, with Python 3.9 and Django 3.2.Create a directory for the project:$ mkdir myyubival
$ cd myyubivalCreate a Python environment and activate it:$ python3 -m venv venv
$ source venv/bin/activateInstall Django and Yubival:$ pip install Django yubivalCreate a new Django project and browse to the newly created directory:$ django-admin startproject myyubival
$ cd myyubivalEdit the./myyubival/settings.pyfile to add'yubival'to theINSTALLED_APPSsetting:INSTALLED_APPS = [
    # ...
    'yubival',
]Make the validation server URLs accessible by editing./myyubival/urls.py. Include the URLs from the Yubival app:from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import RedirectView

urlpatterns = [
    path('', RedirectView.as_view(pattern_name='admin:index')),
    path('admin/', admin.site.urls),
    path('', include('yubival.urls')),
]For convenience, we redirect above the website root to the admin area.By default, Django will create a SQLite database located in adb.sqlite3file in the project directory. To use other database engines, edit./myyubival/settings.pyto change theDATABASESsetting; see theDatabases doc. In both cases, run afterwards the following command to create the initial database tables:python manage.py migrateTo be able to use the admin site and manage Yubikey devices and server API keys, create an initial user account:$ python manage.py createsuperuserTo run the development web server, launch:$ python manage.py runserverThe website can now be accessed athttp://127.0.0.1:8000/. It should show a "Page not found" error. The validation API is located athttp://127.0.0.1:8000/wsapi/2.0/verifyand the admin site interface athttp://127.0.0.1:8000/admin/.While therunservercommand above is an easy way to check your configuration and test Yubival, it should not be used to run the web server in production. Refer to thedeployment docsto learn how to deploy your new myyubival site.Commands usageGetting helpAll subcommands can print a detailed help with--help. Example:$ python manage.py yubikey --help
$ python manage.py yubikey add-existing --helpAPI keys managementServices that need to use the Yubival validation server require an API key which is a shared secret between Yubival and the service. The key is used to sign requests and responses to and from the validation server. API keys can be managed using themanage.py apikeycommand:$ python manage.py apikey add service.example.com
Created: service.example.com (1):
    id: 1
    key: gnQ1sZWtRgCjm17waaiGHQptp8w=

$ python manage.py apikey list
1  service.example.com

$ python manage.py apikey delete 1
Deleted: service.example.com (1)Yubikey devices managementYubiKeys can be added, listed and deleted using the commands below. To add a key, either usemanage.py yubikey addthat will automatically generate a public ID, a private ID and an AES key that you can use to configure a new Yubikey device, or usemanage.py yubikey add-existingif you have a YubiKey for which you already know its parameters, including its secret key. In any case, make sure that the Yubival server will be the only validation server for the YubiKeys you register. If not, it would become possible to reuse OTP.$ python manage.py yubikey add James
Created: James (cnfbfdinbblh):
    Public ID: cnfbfdinbblh
    Private ID: 1b935e02e095
    AES key: fcea0ea12f97923ec4f952e0e170d419

$ python manage.py yubikey add-existing Evelyn gkhcilelifuv 0123456789ab 00112233445566778899aabbccddeeff
Created: Evelyn (gkhcilelifuv)

$ python manage.py yubikey list
cnfbfdinbblh James
gkhcilelifuv Evelyn

$ python manage.py yubikey delete cnfbfdinbblh
Deleted: James (cnfbfdinbblh)