Skip to content

Instantly share code, notes, and snippets.

@bzd111
Last active July 22, 2022 02:34
Show Gist options
  • Save bzd111/e09cf78238ab2cdd010274981569d76f to your computer and use it in GitHub Desktop.
Save bzd111/e09cf78238ab2cdd010274981569d76f to your computer and use it in GitHub Desktop.
python3 http.server with authentication
import http.server
import cgi
import base64
import json
import os
from urllib.parse import urlparse, parse_qs
class CustomServerHandler(http.server.SimpleHTTPRequestHandler):
def do_HEAD(self):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_AUTHHEAD(self):
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="Demo Realm"')
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_GET(self):
key = self.server.get_auth_key()
''' Present frontpage with user authentication. '''
if self.headers.get('Authorization') == None:
self.do_AUTHHEAD()
super().do_GET()
response = {'success': False, 'error': 'No auth header received'}
self.wfile.write(bytes(json.dumps(response), 'utf-8'))
elif self.headers.get('Authorization') == 'Basic ' + str(key):
super().do_GET()
else:
self.do_AUTHHEAD()
response = {'success': False, 'error': 'Invalid credentials'}
self.wfile.write(bytes(json.dumps(response), 'utf-8'))
def _parse_GET(self):
getvars = parse_qs(urlparse(self.path).query)
return getvars
class CustomHTTPServer(http.server.ThreadingHTTPServer):
key = ''
def __init__(self, address, handlerClass=CustomServerHandler):
super().__init__(address, handlerClass)
def set_auth(self, username, password):
self.key = base64.b64encode(
bytes('%s:%s' % (username, password), 'utf-8')
).decode('ascii')
def get_auth_key(self):
return self.key
if __name__ == '__main__':
server = CustomHTTPServer(('', 5678))
user = os.getenv('USERNAME', 'test')
password = os.getenv('PASSWORD', 'test')
server.set_auth(user, password)
server.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment