基本身份验证 Header 似乎已丢失

Basic Auth Header appears to be lost

我正在写一个 Flask RESTful 服务器和一个 AngularJS 客户端,运行 遇到一个问题,用户名和密码信息似乎在传输过程中丢失,所以说话。

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

我对代码的服务器部分进行了相当多的单元测试,并且授权信息似乎存在于所有这些代码中,所以我至少可以从内部获取用户名和密码,这让我感到安心header 在某些情况下。

此外,我已将 CORS 扩展添加到服务器代码,并允许在服务器范围内使用。看起来下面 url 的选项(总是 returns 200)总是在 GET(returns 401,由于用户名和密码问题)之前调用相同的 url.

参考代码:

服务器授权回调:

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

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

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