我使用 Google Drive Android API 让用户从他们的 Android 设备上的 Google Drive 上传文件到我的服务器。我现在想更改此设置,以允许我的服务器使用跨客户端授权直接访问用户 Google Drive,这意味着我必须生成一个ID Token
using 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
.
--
有什么我从根本上误解的东西,或者这真的是它应该如何工作的吗?