from aiohttp import web
from aiohttp_basicauth import BasicAuthMiddleware
import bcrypt
import sys

password = b'password'

class CustomBasicAuth(BasicAuthMiddleware):
    async def check_credentials(self, username, password, request):
        if status := username == 'bob' and bcrypt.checkpw(password.encode('utf-8'), 
            request.app['hashed']):
            request['user'] = username
        return status


auth = CustomBasicAuth(force=False)

async def public_view(request):
    return web.Response(text='Public view')


@auth.required
async def secret_view(request):
    return web.Response(text=request['user'])

def server():
    app = web.Application(middlewares=[auth])
    app['hashed'] = bcrypt.hashpw(password, bcrypt.gensalt())
    app.router.add_route('GET', '/public', public_view)
    app.router.add_route('GET', '/secret', secret_view)

    web.run_app(app)