0

这篇文章与我上一篇文章有​​关

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 服务器的状态更改。

4

0 回答 0