Я совершенно уверен, что делаю что-то не так, но не смог это определить.
У меня есть мобильное приложение (в настоящее время 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?
Спасибо.