嗨,我喜欢从Erlang服务器应用程序发送FCM推送通知。当用户在浏览器中订阅FCM通知时,swRegistration.pushManager.subscribe()需要一个公钥(applicationServerKey)。
所以为了得到这个密钥,我使用openssl并生成两个PEM文件私钥和公钥。
openssl ecparam -name prime256v1 -genkey -noout -out es_private_key.pem
openssl ec -in es_private_key.pem -pubout -out es_public_key.pem
我知道你可以从firebase控制台获得私钥和公钥。但是提供的密钥不是PEM格式的,并且对jwtthis one进行签名的erlang库使用PEM文件进行签名和验证。
{ok, PrivtPem} = file:read_file("path/to/es_private_key.pem"),
Jwt = jwerl:sign([{name, <<"bob">>}], es256, PrivtPem).
因此,根据生成的PEM私钥,我可以对JWT进行签名,但我需要base64字符串格式的applicationServerKey将其添加到标头中,并在浏览器中订阅用户。
我应该将firebase控制台中的密钥转换为PEMS或将PEMS转换为firebase密钥格式。
我花了两天时间试着和Erlang一起做这件事。
我发现如何在Python中做这件事,我需要一些在Erlang中等价的东西。
raw_pub = vapid.public_key.public_bytes(
serialization.Encoding.X962,
serialization.PublicFormat.UncompressedPoint
)
print("Application Server Key = {}\n\n".format(
b64urlencode(raw_pub)))
1条答案
按热度按时间rn0zuynd1#
Afters days I found how to do this en Erlang.
First I used a library called base64Url from someone called Vladimir.
Then I used the code used by authors of JWERL and at the end I do base64Url encode of the ECPoint bin content.
Below the erlang code:
I'm not specialist in cryptographic and curved keys I want only to sign push content because Google want this. So this code Gives me the 64 octets base64 encoded public key . I can use this public key in push FCM.
I hope this is useful for someone.