web-push-libs / pywebpush

Python Webpush Data encryption library
Mozilla Public License 2.0
317 stars 54 forks source link

Error : Web push send from python backend to fire base using VAPI keys. Unhashable type:'slice' #145

Open ishwara-bhat opened 2 years ago

ishwara-bhat commented 2 years ago

I have trouble getting pywebpush work for my python backend on gcp.

VAPI PUBLIC KEY and PVT KEY obtained from firebase dash board thourhg manual creation

subscriptionObject comes from Angular front end. It used the VAPI PUBLIC KEY to receive the object.

I used the package versions specified in requirement.txt. The call happens from a Flask app route.

webpush(subscription_info = subscriptionObject, data=notificationMessageObject, vapid_private_key=VAPID_PRIVATE_KEY, vapid_claims={"sub": "mailto:mycontact_supplied_at_fire_base_bashboard@mydomain.com"}) Error Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python3.7/site-packages/flask_cors/extension.py", line 110, in wrapped_function return cors_after_request(app.make_response(f(*args, kwargs))) File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception reraise(exc_type, exc_value, tb) File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise raise value File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](req.view_args) File "/app/main.py", line 428, in notify_one_device webpush(subscription_info = subsObject, data=notificationMessageObject, vapid_private_key=VAPID_PRIVATE_KEY, vapid_claims={"sub": "mailto:mymail_configured_at_firebase_dashboard@mycontact.com"}) File "/usr/local/lib/python3.7/site-packages/pywebpush/init.py", line 485, in webpush timeout=timeout, File "/usr/local/lib/python3.7/site-packages/pywebpush/init.py", line 305, in send encoded = self.encode(data, content_encoding) File "/usr/local/lib/python3.7/site-packages/pywebpush/init.py", line 219, in encode version=content_encoding) File "/usr/local/lib/python3.7/site-packages/http_ece/init.py", line 394, in encrypt content[i:i + chunk_size], TypeError: unhashable type: 'slice'

Please guide how I should approach this.

cmesas commented 2 years ago

@ishwara-bhat I have the same problem, how could you solve it?

jrconlin commented 2 years ago

Reading the dump, it appears that the problem is that http_ece can't encrypt content. content comes from data in self.encode(data, content_encoding)

from a very quick view, I'm going to guess that the data being passed in is not a byte array. You may need to serialize the object content into a string or byte array before passing it to webpush.encode

ishwara-bhat commented 2 years ago

For web push alone, I went for nodejs service. Rest of my back end is in python.

On Tue, 23 Aug 2022, 22:31 Carlos Mesas, @.***> wrote:

@ishwara-bhat https://github.com/ishwara-bhat I have the same problem, how could you solve it?

— Reply to this email directly, view it on GitHub https://github.com/web-push-libs/pywebpush/issues/145#issuecomment-1224351178, or unsubscribe https://github.com/notifications/unsubscribe-auth/AJVKQPG2UZOTIDACENMTB7TV2T7VFANCNFSM5KJFSGGQ . You are receiving this because you were mentioned.Message ID: @.***>

cmesas commented 2 years ago

Reading the dump, it appears that the problem is that http_ece can't encrypt content. content comes from data in self.encode(data, content_encoding)

from a very quick view, I'm going to guess that the data being passed in is not a byte array. You may need to serialize the object content into a string or byte array before passing it to webpush.encode

An example of a key pair that I am using are the following. I am using string strings directly.

{ "subject": "mailto: mai@example.com", "publicKey": "BLR4PgElXtaeu16JlFEfVuOZkyub-Y36w1XRDYvl7-gNOKUpW-YadhR0Yv6vnrz5h4HhJG5jq0arBRuIrJdWXtQ", "privateKey": "LqUduWL7V0F7pOrYep5oTgZJaCXLl7eRvMZMpAE6DCA" }

Is it necessary to use PEM certificates or can I use string keys?

jrconlin commented 2 years ago

String keys can be in either raw or DER format: https://github.com/web-push-libs/vapid/blob/main/python/py_vapid/__init__.py#L134-L147. If you provide a path, py_vapid will try to read the file as either PEM or DER formatted https://github.com/web-push-libs/vapid/blob/main/python/py_vapid/__init__.py#L134-L147

cmesas commented 2 years ago

Las claves de cadena pueden estar en formato raw o DER: https://github.com/web-push-libs/vapid/blob/main/python/py_vapid/__init__.py#L134-L147 . Si proporciona una ruta, py_vapid intentará leer el archivo con formato PEM o DER https://github.com/web-push-libs/vapid/blob/main/python/py_vapid/__init__.py#L134-L147

Ok, I will try to work with the private key in PEM format from the file directly.

treygilliland commented 9 months ago

Just ran into this same issue. Make sure your data payload is JSON string encoded and not just a raw python dictionary.