I have the following code:
import sys
from zope.interface import implementer
from twisted.python import log
from twisted.internet import reactor
from twisted.web import server, resource, guard
from twisted.cred.portal import IRealm, Portal
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
class GuardedResource(resource.Resource):
"""
A resource which is protected by guard and requires authentication in order
to access.
"""
def getChild(self, path, request):
return self
def render(self, request):
return "Authorized!"
@implementer(IRealm)
class SimpleRealm(object):
"""
A realm which gives out L{GuardedResource} instances for authenticated
users.
"""
def requestAvatar(self, avatarId, mind, *interfaces):
if resource.IResource in interfaces:
return resource.IResource, GuardedResource(), lambda: None
raise NotImplementedError()
def main():
log.startLogging(sys.stdout)
checkers = [InMemoryUsernamePasswordDatabaseDontUse(joe='blow')]
portal = Portal(SimpleRealm(), checkers)
resource = guard.HTTPAuthSessionWrapper(portal, [guard.BasicCredentialFactory('auth')])
reactor.listenTCP(8889, server.Site(resource = resource))
reactor.run()
if __name__ == '__main__':
main()
when we start the server and visit the url:
http://localhost:8889/ a prompt pop up and ask us to enter user and password. After entering user = joe and password = blow still we are not authorize to access the website. What is wrong in the code above and how to fix it?
So I posted on trac as suggested by @Jean-Paul Calderone and got the problem solved here
There are 2 things to be fixed
InMemoryUsernamePasswordDatabaseDontUsemust be in bytesSo for your code to run in py2 and py3 use this