Преглед на файлове

Add QR image to set up authenticator

pull/40/head
Sindre Stephansen преди 5 години
родител
ревизия
4acd265951
променени са 3 файла, в които са добавени 19 реда и са изтрити 4 реда
  1. +1
    -0
      src/app/requirements.txt
  2. +3
    -2
      src/app/templates/verify.html
  3. +15
    -2
      src/app/views/register.py

+ 1
- 0
src/app/requirements.txt Целия файл

@@ -2,3 +2,4 @@ web.py==0.40
mysql-connector-python==8.0.5
python-dotenv
bcrypt
qrcode[pil]

+ 3
- 2
src/app/templates/verify.html Целия файл

@@ -1,4 +1,4 @@
$def with (nav, success, secret, message)
$def with (nav, success, secret, qr, message)

<head>
<title>Beelance2</title>
@@ -16,8 +16,9 @@ $def with (nav, success, secret, message)

$if success:
<p>We require two-factor authentication on this site.</p>
<p>Please enter the following code into your authenticator: $secret</p>
<p>Please scan the QR code, or enter the following code into your authenticator: $secret</p>
<p>This code will only be displayed once.</p>
<img src="data:image/png;base64,$qr" />
</body>

<footer></footer>

+ 15
- 2
src/app/views/register.py Целия файл

@@ -1,10 +1,13 @@
import web
import io
import base64
from views.forms import register_form
from views.utils import (get_nav_bar, csrf_protected, password_weakness, get_render,
sendmail, hash_password, generate_authenticator_secret)
from uuid import uuid4
import models.register
import models.user
import qrcode
import logging
import re

@@ -100,8 +103,18 @@ class Verify:

if token and userid is not None:
models.user.verify_user(userid)
models.user.set_token(userid, "")
username = models.user.get_user_name_by_id(userid)
secret = generate_authenticator_secret()

# Generate a base64 QR image
qr_url = "otpauth://totp/beelance.com:{}?secret={}&issuer=beelance.com".format(username, secret)
qr_img = qrcode.make(qr_url)
with io.BytesIO() as stream:
qr_img.save(stream)
img = base64.b64encode(stream.getvalue()).decode('UTF-8')

models.user.set_authenticator_secret(userid, secret)
return render.verify(nav, True, secret, "Your email has been verified.")
return render.verify(nav, True, secret, img, "Your email has been verified.")
else:
return render.verify(nav, True, secret, "Invalid token. Please try again.")
return render.verify(nav, False, "", "", "Invalid token. Please try again.")

Loading…
Отказ
Запис