这篇文章与我上一篇文章有关
BankID 能够提供动画 QR 码生成以进行授权。它每秒生成一个新的 QR,您使用移动应用程序进行扫描,然后一旦用户输入他们的代码或扫描他们的指纹,他们的服务器就会返回成功。您可以跳过 QR 码并让 bankID ping 用户以输入他们的代码以进行身份验证,但我希望我的应用程序具有 QR 码功能。
现在我的问题是这个。当发送 POST 请求时,Views 会得到一个 qr_start_token,并从 bankID 服务器返回 qr_start_secret。Views 正在等待来自 BankID 服务器的状态更改以执行某些操作,但这让我对如何在客户端上呈现不断变化的 QR 码感到迷茫。如何在不呈现新页面、通过上下文传递秘密并使用 javascript 复制此过程的情况下做到这一点?
以下是相关代码:
if request.META['HTTP_USER_AGENT']:
ua_string = request.META['HTTP_USER_AGENT']
user_agent = parse(ua_string)
if user_agent.is_pc:
status=client.collect(order_ref=auth["orderRef"])["status"]
order_time = time.time()
while status == "pending":
qr_start_token = auth["qrStartToken"]
qr_start_secret = auth["qrStartSecret"]
print(qr_start_secret)
qr_time = str(int(time.time() - order_time))
qr_auth_code = hmac.new(qr_start_secret.encode(), qr_time.encode(), hashlib.sha256).hexdigest()
qr_data = ".".join(["bankid", qr_start_token, qr_time, qr_auth_code])
print(f'qr_data: {qr_data}')
status=client.collect(order_ref=auth["orderRef"])["status"]
print(status)
# qr = segno.make(qr_data)
# qr.save('media/img/temp/' + personal_number + '.png')
if status == "complete":
print("Logged on")
dj_login(request, user)
return render(request, 'home/auth-login-Success.html')
if status == "failed":
print("Logon Failed")
return render(request, 'home/auth-login-Failed.html')
time.sleep(1)
如您所见,我可以使用 segno 保存 QR 码,效果很好,但我仍然可以使用 JavaScript 将其加载到页面上,因为客户端被锁定,等待来自 BankID 服务器的状态更改。