Основной 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, и это не удается.

Другие вопросы по тегам