72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
from urllib.parse import urlparse, parse_qs
|
|
import json
|
|
import os
|
|
|
|
class WebFingerHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
if self.path.startswith('/.well-known/webfinger'):
|
|
parsed_url = urlparse(self.path)
|
|
query_params = parse_qs(parsed_url.query)
|
|
|
|
if 'resource' in query_params:
|
|
resource = query_params['resource'][0]
|
|
|
|
if resource.startswith('acct:'):
|
|
email = resource[5:]
|
|
issuer_url = os.environ["ISSUER_URL"]
|
|
response_data = {
|
|
"subject": resource,
|
|
"links": [
|
|
{
|
|
"rel": "http://openid.net/specs/connect/1.0/issuer",
|
|
"href": issuer_url
|
|
},
|
|
{
|
|
"rel": "authorization_endpoint",
|
|
"href": issuer_url + "oauth2/authorize"
|
|
},
|
|
{
|
|
"rel": "token_endpoint",
|
|
"href": issuer_url + "oauth2/token"
|
|
},
|
|
{
|
|
"rel": "userinfo_endpoint",
|
|
"href": issuer_url + "userinfo"
|
|
},
|
|
{
|
|
"rel": "jwks_uri",
|
|
"href": issuer_url + "jwks"
|
|
}
|
|
]
|
|
}
|
|
self.send_response(200)
|
|
self.send_header("Content-type", "application/json")
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps(response_data).encode())
|
|
return
|
|
|
|
if self.path.startswith('/health'):
|
|
self.send_response(200)
|
|
response_data = {
|
|
"health": "ok"
|
|
}
|
|
self.send_header("Content-type", "application/json")
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps(response_data).encode())
|
|
return
|
|
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
self.wfile.write(b"Resource not found")
|
|
|
|
def run_server(server_class=HTTPServer, handler_class=WebFingerHandler, port=8000):
|
|
server_address = ('', port)
|
|
httpd = server_class(server_address, handler_class)
|
|
print("Issuer URL is " + os.environ["ISSUER_URL"])
|
|
print(f"Starting WebFinger server on port {port}")
|
|
httpd.serve_forever()
|
|
|
|
if __name__ == '__main__':
|
|
run_server() |