Основной Auth Header, кажется, потерян
Я пишу сервер Flask RESTful и клиент AngularJS, и столкнулся с проблемой, когда кажется, что информация об имени пользователя и пароле теряется при передаче, так сказать.
В консоли Javascript я могу сказать, что клиент отправляет заголовок авторизации, как и ожидалось: Authorization: Basic username:password
, Однако в обратном вызове @auth.verify_password они оба пусты.
У меня довольно много модульных тестов вокруг серверной части кода, и информация об аутентификации, по-видимому, присутствует во всех них, поэтому обнадеживает то, что в некоторых случаях я могу хотя бы получить имя пользователя и пароль из заголовка,
Кроме того, я добавил расширение CORS к коду сервера и разрешил его для всего сервера. Похоже, что OPTIONS(который всегда возвращает 200) для указанного ниже URL-адреса всегда вызывается непосредственно перед GET(возвращает 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, который выдает соответствующий заголовок при проверке в браузере, но пустые имя пользователя и пароль в обратном вызове аутентификации:
$http.get(silkyAppConstants.BASE_URL + '/api/users/token', {
headers: { "Authorization": "Basic " + username + ":" + password }
})
1 ответ
Я подозреваю, что ваша проблема в том, что вы отправляете недействительный Authorization
заголовок. username + ":" + password
часть заголовка должна быть закодирована в base64 (см. Раздел 2 RFC 2617. Когда Flask получает учетные данные в виде простого текста, которые вы отправляете, он пытается пропустить его через декодер base64, и это не удается.