Having trouble getting Google Drive authorization

試著忘記壹切 提交于 2020-07-16 09:22:08

问题


I have an Android app that I am trying to (re)implement Google Drive access for. The method I'm following is Google's migration guide to the update REST API here. I have my consent page set up properly, and everything works on the iOS side of things, so I assume at very least the credentials are set up properly.

I start with:

    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);
        }
    }

If not logged in, I call this, which (successfully) launches the auth flow:

@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);
    }
}

In my Activity I handle the result using:

@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));
        }
    }
    ...
}

which calls:

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

Finally, everything comes down to:

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();
}

The problem is that this works just fine when I'm debugging, on my device. Once I deploy to Google Play, however, it fails. It goes through the authorization process, and logging shows that it gets to the setupClientFromAccount() in handleSignInResult(). But any Drive operations fail.

Now, that sounds to me like it may be a (re)signing issue, since that's the only real difference between the development/debug version and the release/Google Play version. But the credentials on the Google Play developer console are actually generated for the release key's SHA-1.

Am I missing something obvious?

(EDIT: Some further, ultimately unsuccessful steps taken to try to resolve this here.)

来源:https://stackoverflow.com/questions/60964590/having-trouble-getting-google-drive-authorization

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!