Python/WebApp Google App Engine - 在头部测试用户/密码

4 投票
3 回答
1997 浏览
提问于 2025-04-15 14:42

当你像这样调用一个网络服务时:

   username = 'test12'
   password = 'test34' 
   client = httplib2.Http(".cache") 
   client.add_credentials(username,password)
   URL = "http://localhost:8080/wyWebServiceTest"
   response, content = client.request(URL) 

你怎么把用户名和密码放到服务器端的变量里(也就是我正在写的这个网络服务里)?我查看了self.request.headers和self.request.environ,但没有找到它们。

(我不是在使用谷歌登录,需要把这个用户ID和密码跟我自己的数据库对比,以验证安全性。)

我在尝试从这个页面获取一些想法:http://pythonpaste.org/webob/reference.html#headers

谢谢,

Neal Walters

对Peter的代码稍作增强:

 auth = None 
 if 'Authorization' in self.request.headers: 
    auth = self.request.headers['Authorization']
 if not auth:

3 个回答

1

httplib2 这个库只有在收到来自网站服务器的401错误响应后,才会发送凭证。之后,这些凭证会通过一个叫做 Authorization 的头部信息发送过去。

3

认证信息会出现在授权头中。整个过程是这样的:

  1. 客户端向你的应用发送请求,但没有进行任何授权尝试。
  2. 服务器回应一个“401 需要授权”的信息,并且在“WWW-Authenticate”头中设置为 'Basic realm="something"'(这是基本认证的方式)。
  3. 客户端根据要求,发送一个合适的授权头。

在第三步中,客户端的授权头具体内容取决于使用的授权方法。对于HTTP基本认证,它是经过base64编码的用户凭证——详细信息可以查看这里。而对于HTTP摘要认证,服务器的头和客户端的回应会稍微复杂一些——可以查看这里了解更多。

7

我还没有测试这段代码(插个笑脸),但我觉得这就是你需要的东西。简单来说,如果你的服务器没有给客户端返回一个401的错误,那么你的凭证就不会出现在请求的头部。客户端需要知道“领域”才能知道该提供什么凭证。

class MYREALM_securepage(webapp.RequestHandler):
  def get(self):
      if not 'Authorization' in self.request.headers:
          self.response.headers['WWW-Authenticate'] = 'Basic realm="MYREALM"'
          self.response.set_status(401)
          self.response.out.write("Authorization required")
      else:
          auth = self.request.headers['Authorization']
          (username, password) = base64.b64decode(auth.split(' ')[1]).split(':')
          # Check the username and password, and proceed ...

撰写回答