基本认证头似乎丢失了



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

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

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

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

参考代码:

服务器认证回调:

@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代码,在浏览器中检查时产生适当的头,但在auth回调中为空的用户名和密码:

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

我怀疑你的问题是你正在发送一个无效的Authorization头。报头的username + ":" + password部分必须是base64编码的(参见RFC 2617的第2节)。当Flask接收到你发送的纯文本凭证时,它正在尝试通过base64解码器传递它,但是失败了。

相关内容

  • 没有找到相关文章

最新更新