1

我使用 Google Drive Android API 让用户从他们的 Android 设备上的 Google Drive 上传文件到我的服务器。我现在想更改此设置,以允许我的服务器使用跨客户端授权直接访问用户 Google Drive,这意味着我必须生成一个ID Tokenusing GoogleAuthUtil.getToken. 这就是一切都出轨了。为了生成这个令牌,我需要一个Account对象。

目前,我正在设置GoogleApiClient这样的:

mGoogleApiClient = new GoogleApiClient.Builder(getContext())
    .addApi(Drive.API)
    .addScope(Drive.SCOPE_FILE)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .build();

这很好用,它时不时地显示一个帐户选择器,用户可以在其中选择要连接的帐户。全部由框架管理。但是无法访问Account用户选择连接的用户!

相反,我必须自己管理它,使用:

Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"},
    false, null, null, null, null);
startActivityForResult(intent, RC_ACCOUNT_PICKER);

onActivityResult我可以使用以下方法获取所选帐户:

Account account = new Account(intent.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME),
    intent.getExtras().getString(AccountManager.KEY_ACCOUNT_TYPE));

现在,由于我有一个Account对象,我可以使用它显式连接:

mGoogleApiClient = new GoogleApiClient.Builder(getContext())
    .addApi(Drive.API)
    .addScope(Drive.SCOPE_FILE)
    .setAccountName(mAccount.name) // Account name!
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .build();

这是我唯一的选择吗,真的没有办法让Account用户使用我的第一个解决方案来选择吗?

--

稍后,当尝试生成我的ID Token使用时:

String scope = String.format("oauth2:server:client_id:%s:api_scope:%s",
    "12345.apps.googleusercontent.com", 
    "https://www.googleapis.com/auth/drive.file");
String token = GoogleAuthUtil.getToken(getContext(), mAccount, scope);

UserRecoverableAuthException即使我使用与连接时相同的帐户和相同的身份验证范围,我仍然需要从用户那里获得另一个权限。处理完所有这些后,我可以再次运行相同的代码并最终获得我的ID Token.

--

有什么我从根本上误解的东西,或者这真的是它应该如何工作的吗?

4

1 回答 1

3

您不应该再使用此博客文章GoogleAuthUtil.getToken()中的说明,因为将这些令牌传递到您的服务器是不安全的。

相反,您应该使用通过Google 登录启用服务器端访问并使用requestServerAuthCode() 方法

这样可以避免双重提示用户,不使用GET_ACCOUNTS权限,并为您提供单用户登录流程。

于 2016-06-29T20:23:12.200 回答