使用web.py和web.webopenid进行用户认证

0 投票
1 回答
843 浏览
提问于 2025-04-16 11:41

我有一个用 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 个回答

0

这个问题的明显原因大概在mod_wsgi的讨论列表中已经有人回答过了。你可以看看这里:

https://groups.google.com/d/msg/modwsgi/iL65jNeY5jA/KgEq33E8548J

问题可能是由前两个因素造成的,分别是当前的工作目录和Apache用户的访问权限。

撰写回答