Mercurial > prosody-modules
view mod_rest/example/prosody_oauth.py @ 6411:b00638d74f46
mod_unified_push: Allow additional CORS headers for unified push (fixes #1985)
- Request header "TTL" is mandated by the HTTP Push specification
RFC 8030: https://datatracker.ietf.org/doc/html/rfc8030#section-5
- Firefox sends "Content-Encoding" with a HTTP form submission,
so it is required when using the Unified Push testing tool
at https://unifiedpush.org/test_wp.html
(with the full URL being delivered by the UP-Example Android app)
Adding both headers makes the Unified Push testing tool work from
the browser.
Resolves: https://issues.prosody.im/1985
| author | Christian Weiske <cweiske@cweiske.de> |
|---|---|
| date | Sat, 21 Feb 2026 19:13:08 +0100 |
| parents | 9a4556a13cc7 |
| children |
line wrap: on
line source
from requests_oauthlib import OAuth2Session import requests class ProsodyRestSession(OAuth2Session): def __init__( self, base_url, client_name, client_uri, redirect_uri, *args, **kwargs ): self.base_url = base_url discovery_url = base_url + "/.well-known/oauth-authorization-server" meta = requests.get(discovery_url).json() reg = requests.post( meta["registration_endpoint"], json={ "client_name": client_name, "client_uri": client_uri, "redirect_uris": [redirect_uri], "application_type": redirect_uri[:8] == "https://" and "web" or "native", }, ).json() super().__init__(client_id=reg["client_id"], *args, **kwargs) self.meta = meta self.client_secret = reg["client_secret"] self.client_id = reg["client_id"] def authorization_url(self, *args, **kwargs): return super().authorization_url( self.meta["authorization_endpoint"], *args, **kwargs ) def fetch_token(self, *args, **kwargs): return super().fetch_token( token_url=self.meta["token_endpoint"], client_secret=self.client_secret, *args, **kwargs ) def xmpp(self, json=None, *args, **kwargs): return self.post(self.base_url + "/rest", json=json, *args, **kwargs) if __name__ == "__main__": # Example usage # from prosody_oauth import ProsodyRestSession from getpass import getpass p = ProsodyRestSession( input("Base URL: "), "Prosody mod_rest OAuth 2 example", "https://modules.prosody.im/mod_rest", "urn:ietf:wg:oauth:2.0:oob", ) print("Open the following URL in a browser and login:") print(p.authorization_url()[0]) p.fetch_token(code=getpass("Paste Authorization code: ")) print(p.xmpp(json={"disco": True, "to": "jabber.org"}).json())
