使用web.py和web.webopenid进行用户认证
我有一个用 web.py 写的应用程序,正在通过 mod_wsgi 在本地运行(http://localhost/...)。我现在想给我的应用加上认证功能,打算使用 web.py 自带的模块。我从这里找到一个简单的例子:http://log.liminastudio.com/programming/howto-use-openid-with-web-py
import web, web.webopenid
urls = (
r'/openid', 'web.webopenid.host',
r'/', 'Index'
)
app = web.application(urls, globals())
class Index:
def GET(self):
body = '''
<html><head><title>Web.py OpenID Test</title></head>
<body>
%s
</body>
</html>
''' % (web.webopenid.form('/openid'))
return body
if __name__ == "__main__": app.run()
在终端运行这个例子,然后访问 http://localhost:8080/,效果还不错。还有另一个例子 http://c-farrell.blogspot.com/2010/11/usrbinenv-pythonimport-webfrom-web.html,用的技术类似,但我觉得更容易理解。
#!/usr/bin/env python
import web
from web import webopenid
urls = (
'/', 'index',
'/openid', 'webopenid.host',
)
... more code ...
class index:
def GET(self):
oid = webopenid.status()
if not oid:
return 'please log in: ' + \
webopenid.form('/openid')
else:
return 'you are logged in as:' + \
webopenid.form('/openid')
不过在这里我有点迷糊了。根据我的理解,传给 form
的参数是登录后返回的 URL。例如,如果我填上 'http://www.yahoo.com/',每次登录尝试后都会带我去那个地方。我觉得这个地址应该指向我自己的控制器,然后在那儿检查,但似乎大家都习惯用 web.webopenid.host 控制器,我猜是处理身份验证并返回到基础的 '/' URL。我觉得我快明白了,但返回的状态总是 None
。
从我了解的情况来看,这可能是代码的问题,或者是我的 Apache 配置有问题,导致认证无法正常工作。在 web.webopenid 中,这个库会在和 web 服务器同一目录下创建一个 .openid_secret_key 文件。当我运行示例代码时,这个文件会被创建。但当我通过 Apache 运行我的代码时,这个文件没有被创建(至少在 cgi-bin 里没有。可能在别的地方?)总之,如果这个文件没有被生成或者每次都没有重新生成,我就无法登录。我认为这是 Apache 的问题,因为我尝试通过 web.py 自带的 web 服务器运行我的应用时,文件是被创建的,并且我可以进行认证。我只能得出结论,这个文件没有被写入,每次查询都尝试新文件,导致我无法认证。有没有 Apache/mod_wsgi 的高手能告诉我这个文件是写到哪里了,或者这是否就是实际的问题?
1 个回答
这个问题的明显原因大概在mod_wsgi的讨论列表中已经有人回答过了。你可以看看这里:
https://groups.google.com/d/msg/modwsgi/iL65jNeY5jA/KgEq33E8548J
问题可能是由前两个因素造成的,分别是当前的工作目录和Apache用户的访问权限。