【问题标题】:Basic Auth Header appears to be lost基本身份验证标头似乎丢失了
【发布时间】:2015-11-19 09:31:08
【问题描述】:

我正在编写一个 Flask RESTful 服务器和一个 AngularJS 客户端,并且遇到了一个问题,即用户名和密码信息似乎在传输中丢失了,可以这么说。

在 Javascript 控制台中,我可以看出客户端正在按预期发送授权标头:Authorization: Basic username:password。但是,在@auth.verify_password 回调中,它们都是空的。

我对代码的服务器部分进行了相当多的单元测试,并且所有这些测试中都显示了身份验证信息,因此我至少可以从标头中获取用户名和密码,这令人放心在某些情况下。

此外,我已将 CORS 扩展添加到服务器代码中,并允许它在服务器范围内使用。似乎总是在 GET(由于用户名和密码问题,返回 401)到同一个 url 之前立即调用到下面 url 的 OPTIONS(总是返回 200)。

参考代码:

服务器认证回调:

@app.route('/api/users/token')
@auth.login_required
def get_auth_token():
    token = g.user.generate_auth_token()
    return jsonify({ 'token': token.decode('ascii') })

@auth.verify_password
def verify_password(email_or_token, password):
    print 'email_or_token: ' + email_or_token
    print 'password: ' + password
    ...

服务器单元测试代码按预期运行:

def _get_user_token(self, email=TEST_EMAIL, password=TEST_PASSWORD):
    headers = {
        'Authorization': 'Basic ' + b64encode("{0}:{1}".format(email, password))
    }
    response = self.app.get('/api/users/token', headers=headers)
    return response

AngularJS 代码在浏览器中检查时会生成适当的标头,但在身份验证回调中为空用户名和密码:

$http.get(silkyAppConstants.BASE_URL + '/api/users/token', {
  headers: { "Authorization": "Basic " + username + ":" + password }
})

【问题讨论】:

  • 您是否尝试在您的$http.get 通话中添加withCredentials: true
  • @tommyd456 刚刚试了一下,我知道只看到 OPTIONS 调用,服务器以 200 响应,但之后没有 GET 请求。
  • @tommyd456 这是由于服务器未将“Access-Control-Allow-Credentials”true 添加到标头。添加了,但现在在第 1 格仍然没有。
  • 现在有答案了,让我知道它是否有效,因为我很难自己做类似的事情。
  • 您能否也看看它是否适用于下面的建议答案但没有withCredentials 建议

标签: angularjs flask basic-authentication flask-httpauth flask-cors


【解决方案1】:

我怀疑您的问题是您发送的 Authorization 标头无效。标头的 username + ":" + password 部分必须是 base64 编码(请参阅 RFC 2617 的第 2 节。当 Flask 收到您发送的纯文本凭据时,它会尝试通过 base64 解码器传递它,但失败了。

【讨论】:

  • 谢谢@Miguel,刚刚意识到这也是可能的嫌疑人。我开始比较单元测试和客户端代码之间的原始请求标头,并注意到编码的不同。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多