跳转到主要内容

Python的BankID受信任方客户端

项目描述

PyBankID

Build and Test Documentation Status PyPI Version PyPI License

PyBankID是一个作为受信任方的客户端,提供BankID服务,即向最终用户提供身份验证和签名功能。该软件包提供了一个简化的接口,用于发起身份验证和签名订单,然后从BankID服务器收集结果。

从1.0.0版本开始,PyBankID支持的唯一BankID API版本是v6.0,这意味着Secure Start解决方案是提供BankID服务的唯一支持方式。1.0.0版本之前的PyBankID版本将在2024年5月1日之后无法使用。

如果您打算在项目中使用PyBankID,建议在执行其他操作之前阅读BankID集成指南。在那里可以找到有关BankID方法定义和使用它们的信息。

安装

PyBankID可以通过pip安装

pip install pybankid

使用

PyBankID为与BankID服务的通信提供同步和异步客户端。下面的示例将使用同步客户端,但异步客户端的使用方式相同,只需在每个函数调用之前使用await关键字。

同步客户端

from bankid import BankIDClient
client = BankIDClient(certificates=(
    'path/to/certificate.pem',
    'path/to/key.pem',
))

客户端默认连接到生产服务器。如果需要测试服务器,则在客户端初始化时发送test_server=True关键字。

所有身份验证和签名调用都需要包含最终用户的IP地址。身份验证订单如下发起

client.authenticate(end_user_ip='194.168.2.25')
{
    'orderRef': 'ee3421ea-2096-4000-8130-82648efe0927',
    'autoStartToken': 'e8df5c3c-c67b-4a01-bfe5-fefeab760beb',
    'qrStartToken': '01f94e28-857f-4d8a-bf8e-6c5a24466658',
    'qrStartSecret': 'b4214886-3b5b-46ab-bc08-6862fddc0e06'
}

签名订单以类似方式发起

client.sign(
    end_user_ip='194.168.2.25',
    user_visible_data="The information to sign."
)
{
    'orderRef': 'ee3421ea-2096-4000-8130-82648efe0927',
    'autoStartToken': 'e8df5c3c-c67b-4a01-bfe5-fefeab760beb',
    'qrStartToken': '01f94e28-857f-4d8a-bf8e-6c5a24466658',
    'qrStartSecret': 'b4214886-3b5b-46ab-bc08-6862fddc0e06'
}

如果您希望确保只有一个人可以进行验证或签名,您可以使用requirement关键字来指定这一点。

client.sign(
   end_user_ip='194.168.2.25',
   user_visible_data="The information to sign."
   requirement={"personalNumber": "YYYYMMDDXXXX"}
)
{
    'orderRef': 'ee3421ea-2096-4000-8130-82648efe0927',
    'autoStartToken': 'e8df5c3c-c67b-4a01-bfe5-fefeab760beb',
    'qrStartToken': '01f94e28-857f-4d8a-bf8e-6c5a24466658',
    'qrStartSecret': 'b4214886-3b5b-46ab-bc08-6862fddc0e06'
}

如果您指定的其他人尝试进行验证或签名,BankID应用程序将表示此请求不是针对该用户的。

然后可以通过使用接收到的orderRef进行轮询来研究订单状态。

client.collect(order_ref="a9b791c3-459f-492b-bf61-23027876140b")
{
    'hintCode': 'outstandingTransaction',
    'orderRef': 'a9b791c3-459f-492b-bf61-23027876140b',
    'status': 'pending'
}
client.collect(order_ref="a9b791c3-459f-492b-bf61-23027876140b")
{
    'hintCode': 'userSign',
    'orderRef': 'a9b791c3-459f-492b-bf61-23027876140b',
    'status': 'pending'
}
client.collect(order_ref="a9b791c3-459f-492b-bf61-23027876140b")
{
    'completionData': {
        'cert': {
            'notAfter': '1581289199000',
            'notBefore': '1518130800000'
        },
        'device': {
            'ipAddress': '0.0.0.0'
        },
        'ocspResponse': 'MIIHegoBAKCCB[...]',
        'signature': 'PD94bWwgdmVyc2lv[...]',
        'user': {
            'givenName': 'Namn',
            'name': 'Namn Namnsson',
            'personalNumber': 'YYYYMMDDXXXX',
            'surname': 'Namnsson'
        }
    },
    'orderRef': 'a9b791c3-459f-492b-bf61-23027876140b',
    'status': 'complete'
}

请注意,应谨慎使用collect方法:在BankID集成指南中指定,"collect应该每两秒调用一次,且不得频繁于每秒一次"

PyBankID还实现了phone/authphone/sign方法,用于通过电话联系的用户进行验证和签名。有关此方面的文档,请参阅PyBankID的Read the Docs页面

异步客户端

异步客户端的使用方式与同步客户端相同,区别在于所有请求都是异步执行的。

可以通过简单地添加await关键字,将上面的同步指南用作异步客户端的参考。

from bankid import BankIDAsyncClient
client = BankIDAsyncClient(certificates=(
    'path/to/certificate.pem',
    'path/to/key.pem',
))

await client.authenticate(end_user_ip='194.168.2.25')
{
    'orderRef': 'ee3421ea-2096-4000-8130-82648efe0927',
    'autoStartToken': 'e8df5c3c-c67b-4a01-bfe5-fefeab760beb',
    'qrStartToken': '01f94e28-857f-4d8a-bf8e-6c5a24466658',
    'qrStartSecret': 'b4214886-3b5b-46ab-bc08-6862fddc0e06'
}

PyBankID和二维码

PyBankID可以为您生成二维码,并在存储库的示例文件夹中有一个示例应用程序,名为qrdemo,演示了使用动画二维码进行验证的一种方法。

二维码内容生成是通过BankID客户端实例上的generate_qr_code_content方法或在bankid.qr模块中直接通过同名方法完成的。

证书

生产证书

如果您想在生产环境中使用BankID,那么您必须从销售银行之一购买此服务。他们将为您提供一个证书,可用于通过BankID服务器验证您的公司/应用程序。

此证书需要经过一些处理才能与PyBankID一起使用,具体方法取决于销售银行提供的内容。

测试证书

开发针对BankID测试服务器时使用的证书可以通过PyBankID获得。

import os
import bankid
dir_to_save_cert_and_key_in = os.path.expanduser('~')
cert_and_key = bankid.create_bankid_test_server_cert_and_key(
    dir_to_save_cert_and_key_in)
print(cert_and_key)
['/home/hbldh/certificate.pem', '/home/hbldh/key.pem']
client = bankid.BankIDClient(
    certificates=cert_and_key, test_server=True)

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

pybankid-1.3.0.tar.gz (47.4 kB 查看哈希值)

上传时间

构建分布

pybankid-1.3.0-py2.py3-none-any.whl (35.5 kB 查看哈希值)

上传时间 Python 2 Python 3