Binascii.Error: Неверная base64-кодированная строка: количество символов данных (41) не может быть на 1 больше, чем кратно 4
Я пытаюсь использовать py-vapid
, pywebpush
и django-push-notifications
для отправки уведомлений через Webpush. Когда я пытаюсь отправить тестовое уведомление с сайта администратора django, я получаю в консоли такой лог отслеживания:
Кажется, что он говорит, что мои ключи не имеют правильного формата для преобразования в Base64, но я проверил документацию pywebpush, и мои ключи имеют правильный формат VAPID EC2 private key PEM file
. Они были сгенерированы с помощью py-vapid
следующим образом:
import os
from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption, PublicFormat
from py_vapid import Vapid
import base64
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Generate VAPID key pair
vapid = Vapid()
vapid.generate_keys()
# Get public and private keys for the vapid key pair
vapid.save_public_key(os.path.join(PROJECT_ROOT, "keys", "webpush", "public_key.pem"))
public_key_bytes = vapid.public_key.public_bytes(Encoding.X962, PublicFormat.UncompressedPoint)
vapid.save_key(os.path.join(PROJECT_ROOT, "keys", "webpush", "private_key.pem"))
# Convert the public key to applicationServerKey format
application_server_key = base64.urlsafe_b64encode(public_key_bytes).replace(b'=', b'').decode('utf8')
with open(os.path.join(PROJECT_ROOT, "keys", "webpush", "ApplicationServerKey.key"), "w") as f:
f.write(application_server_key)
Вот тестовые ключи, о которых идет речь:
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFCZ0WxsNENwKK3Pf
c0HFZPDlr/KAmjIwB6Hz/OdH/YKhRANCAASFpOW98Q4xfCjD0Taog9ZstRQgS+Ch
L7HoOBGHFZAQwpEd83Qt58bnUCIZFwMZc4tyHKV+b0UxM2cMzm8pMI4z
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhaTlvfEOMXwow9E2qIPWbLUUIEvg
oS+x6DgRhxWQEMKRHfN0LefG51AiGRcDGXOLchylfm9FMTNnDM5vKTCOMw==
-----END PUBLIC KEY-----
Я пытался сгенерировать ключи вручную с помощью OpenSSL, но они все равно не работают.