Возникли проблемы при получении авторизации на Google Диске - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть приложение Android, для которого я пытаюсь (ре) реализовать доступ к Google Диску. Метод, которым я следую, - это руководство по миграции Google для обновления REST API здесь . Моя страница согласия настроена правильно, и все работает на стороне iOS, поэтому я предполагаю, что, по крайней мере, учетные данные настроены правильно.

Я начинаю с:

    GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(new Scope(DriveScopes.DRIVE))
            .requestEmail()
            .build();
    mSignInClient = GoogleSignIn.getClient(activity, signInOptions);
    Task<GoogleSignInAccount> task = mSignInClient.silentSignIn();
    if (task.isSuccessful()) {
        // There's an immediate result available
        GoogleSignInAccount account = task.getResult();
        if (account != null) {
            setupClientFromAccount(activity, account);
        }
    }

Если не войти в систему, я вызываю это, что (успешно) запускает поток аутентификации:

@Override
public void login(final Activity activity) {
    if (isLoggedIn()) {
        return;
    }
    Task<GoogleSignInAccount> task = mSignInClient.silentSignIn();
    if (task.isSuccessful()) {
        // There's an immediate result available
        GoogleSignInAccount account = task.getResult();
        if (account != null) {
            setupClientFromAccount(activity, account);
        }
    }
    else {
        // The result of the sign-in Intent is handled in onActivityResult
        activity.startActivityForResult(mSignInClient.getSignInIntent(), REQUEST_GOOGLE_SIGN_IN);
    }
}

В моей деятельности я обрабатываю результат, используя:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == REQUEST_GOOGLE_SIGN_IN) {
        if (resultCode == Activity.RESULT_OK && resultData != null) {
            handleSignInResult(this, resultData);
        } else {
            Log.e(TAG, String.format("Unable to complete Google sign-in (resultCode: %d)", resultCode));
        }
    }
    ...
}

, который вызывает :

void handleSignInResult(Context context, Intent result) {
    GoogleSignIn.getSignedInAccountFromIntent(result)
            .addOnSuccessListener(account -> {
                Log.d(TAG, "handleSignInResult(): " + account.getEmail());
                setupClientFromAccount(context, account);
            })
    ...
}

Наконец, все сводится к следующему:

private void setupClientFromAccount(Context context, GoogleSignInAccount account) {
    // Use the authenticated account to sign in to the Drive service
    GoogleAccountCredential credential =
            GoogleAccountCredential.usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE));
    credential.setSelectedAccount(account.getAccount());
    mDrive = new Drive.Builder(
                    AndroidHttp.newCompatibleTransport(),
                    new GsonFactory(),
                    credential)
                .setApplicationName("App Name")
                .build();
}

Проблема в том, что на моем устройстве это работает очень хорошо, когда я отлаживаю. Однако после развертывания в Google Play происходит сбой. Он проходит процесс авторизации, и регистрация показывает, что он достигает setupClientFromAccount() в handleSignInResult(). Но любая операция с диском не удалась.

Теперь мне кажется, что это может быть проблема (повторного) подписания, поскольку это единственное реальное различие между версией разработки / отладки и версией / версией Google Play. Но учетные данные в консоли разработчика Google Play фактически генерируются для ключа релиза SHA-1.

Я что-то упускаю из виду?

...