Мобильное (Android) приложение пытается OAuth2 с Flask -Dance - PullRequest
0 голосов
/ 07 апреля 2020

Я совершенно уверен, что делаю что-то не так, но не смог это определить.

У меня есть мобильное приложение (в настоящее время Android), которое необходимо получить и отправить код авторизации Python сервер работает Flask -Dance. Вход через браузер работает просто отлично: вызовите REST API из браузера, получите запрос на ввод учетных данных пользователя и завершите танец, чтобы получить ожидаемый ответ от Python.

Однако, с Android это доказывает быть проблемой. Процесс документирован здесь: https://flask-dance.readthedocs.io/en/latest/how-oauth-works.html#oauth -2

Для начала приложение Android при вызове представления, заключенного в @login_required, выглядит следующим образом:

@app.route('/dashboard')
@login_required
def dashboard():
    ...

запускает перенаправление кода авторизации (в HTML и с помощью Jsoup), может извлечь ClientId, состояние, redirect_uri и т. Д. c. Тем не менее, GoogleSignInOptions не имеет никакого места, чтобы предоставить «состояние». Это может быть проблематично c в нисходящем направлении, но сейчас я могу вернуть код авторизации.

private void getAuthCode() {
    // Start the retrieval process for a server auth code. 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(new Scope(Scopes.PROFILE))
            .requestServerAuthCode(mClientId)
            .requestEmail()
            .build();
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
    Intent signInIntent = mGoogleSignInClient.getSignInIntent();
    startActivityForResult(signInIntent, RC_GET_AUTH_CODE);
}

И ...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_GET_AUTH_CODE) {
        // [START get_auth_code]
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            GoogleSignInAccount account = task.getResult(ApiException.class);
            String authCode = account.getServerAuthCode();
            Log.i(TAG, "Auth code request succeeded: " + authCode);

            processAuth();
        } catch (ApiException e) {
            Log.w(TAG, "Sign-in / auth request failed", e);
        }
    }
}

Вот где я застрял. В «данных» намерения нет (или есть) способа получить перенаправление для отправки authCode, который Flask -Dance и в общем случае предикат OAuth2 Flow. Я написал специальное представление в Python для отправки «authCode», и оно может успешно использовать API-интерфейсы oauth2client для получения профиля и электронной почты ассоциированного пользователя. Но это не Flask -Dance.

Я фактически вызывал каждую конечную точку Google OAuth, используя HtpPost или HttPGet по отдельности, кропотливо запуская Wireshark в сценарии браузера), чтобы обнаружить каждый шаг, что довольно болезненно, но было бы приемлемо, если бы не подвержен ошибкам, поскольку каждый HTTP-запрос должен иметь правильные параметры (и, возможно, заголовки). Ни одна из документации Google не помогает, и я думаю, что на самом деле она довольно бедна (с большим количеством повторений, но пропускает ключевую информацию).

Net net: как отправить код авторизации из Android приложение к Flask -Данс, чтобы завершить танец OAuth2, а затем получить представление / панель инструментов, которое "запустило танец"? И любой другой вид, который обернут в @login_required?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...