Как получить код / ​​токен аутентификации, используя Authlib 2.0 на Flask?

Я прочитал часть документации Authlib и пример несколько раз, я также прочитал статьи о концепции Auth 2.0, но я не могу понять, как это сделать. Я хочу, чтобы мой пользователь выполнил вход в систему (используя имя пользователя и пароль), а затем мое приложение вернуло токен. После этого пользователь может использовать личные ресурсы @require_oauth('profile'),

Мой клиент:

*************************** 1. row ***************************
                 client_id: wmahDfsran1jk6CaH1knpi3n
             client_secret: mnr4j15pZurBPYHq4KW4LY8HC7pS4TwjzMlJAUGmo7Bpy5gP
                 issued_at: 1531271519
                expires_at: 0
              redirect_uri: http://127.0.0.1:5000/oauth/token
token_endpoint_auth_method: client_secret_basic
                grant_type: authorization_code password
             response_type: code
                     scope: profile
               client_name: client_test
                client_uri: http://127.0.0.1:5000/
                  logo_uri: NULL
                   contact: NULL
                   tos_uri: NULL
                policy_uri: NULL
                  jwks_uri: NULL
                 jwks_text: NULL
             i18n_metadata: NULL
               software_id: NULL
          software_version: NULL
                        id: 2
                   user_id: 1

Мой запрос POST (с использованием почтальона):

http://127.0.0.1:5000/oauth/authorize?response_type=code&client_id=wmahDfsran1jk6CaH1knpi3n

Ошибка после выполнения запроса:

{
    "error": "invalid_grant"
}

Авторизуйтесь:

@routes.route('/oauth/authorize', methods=['GET', 'POST'])
def authorize():  
    user = current_user()

    try:
        grant = authorization.validate_consent_request(end_user=user)
    except OAuth2Error as error:
        return error.error

    return authorization.create_authorization_response(grant_user=user)

Токен:

@routes.route('/oauth/token', methods=['POST', 'GET'])
def issue_token():
    return authorization.create_token_response()

Профиль:

@routes.route('/resource/profile', methods=['GET', 'POST'])
@require_oauth('profile')
def profile():
    user = current_user()

    return jsonify(id=user.id, username=user.username, secret=user.secret, client_id=user.client_id)

Токен продолжает то же самое, что и в примере Auth.

Если я попытаюсь получить доступ /resource/profile без токена / autorização:

{"error": "missing_authorization", "error_description": "Missing \"Authorization\" in headers."}

Как я могу это исправить?

Obs: После того, как я исправил это, как я могу получить токен аутентификации и отправить его в заголовок /resource/profile?

Другие ссылки: авторизовать доступ к веб-приложениям Azure Active Directory с помощью потока предоставления кода OAuth 2.0, OAuth 2.0: обзор, invalid_grant пытается получить токен oAuth из Google Ask, обстоятельства возникновения ошибки "invalid_grant" при обновлении токена доступа?, Код авторизации Grant return invalid_grant...

1 ответ

Решение

Я хочу, чтобы мой пользователь выполнил вход в систему (используя имя пользователя и пароль), а затем мое приложение вернуло токен

В этом случае вам нужно grant_type=password поток, который можно найти по адресу https://docs.authlib.org/en/latest/flask/oauth2.html

Понять, как это работает на: https://tools.ietf.org/html/rfc6749

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