当前位置: 首页 > 知识库问答 >
问题:

Google Drive Android API和跨客户端授权

洪国兴
2023-03-14

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

目前,我正在设置GoogleApiClient如下:

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

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

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

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

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

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

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

--

稍后,当尝试使用以下方式生成我的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

--

有什么我从根本上误解了的吗?还是它真的应该是这样工作的?

共有1个答案

鲍高扬
2023-03-14

您不应该再使用GoogleAuthUtil.getToken(),因为将这些令牌传递给您的服务器是不安全的。

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

这样可以避免对用户进行双重提示,不使用GET\u ACCOUNTS权限,并为您提供一个用于登录的单用户流。

 类似资料:
  • 我们使用keycloak-adapter与Jetty一起使用KeyCloak进行身份验证和授权。根据OIDC Auth流程的Keycloak文档: 我们有连接到Jetty并使用Auth的webapps。因此,我们创建了一个公共客户端,它对WebApp/REST身份验证非常有效。 问题是,一旦我们启用授权,客户端类型就会从公共类型转换为机密类型,并且不允许将其重置为公共类型。现在,我们在汤里。由于授

  • 我正在编写一个类,用于创建对BigQuery和Google云存储的授权。 在过去,我曾使用,但已被弃用。我试图使用,但我发现它只允许我使用,而我需要。 我知道可以从转换为,但我不知道如何将它们转换成相反的方向(转换为)。例如,我像这样创建连接: 有人能给我指明如何实现这一目标的方向吗? 谢谢!

  • OAuth2 JWT 配置文件引入了将 JWT 用作授权授予和客户端身份验证的可能性。 JWT客户端身份验证功能独立于特定的授权类型,并且可以与任何授权类型一起使用,也可以与客户端凭据授权一起使用。 但是,使用 JWT 授权类型似乎与将客户端凭据授予与 JWT 客户端身份验证结合使用完全相同,只是语法略有不同。 在这两种情况下,客户端都会联系令牌终结点以获取访问令牌: vs

  • 我使用Laravel Passport(Laravel 5.6),使用密码授予。我有两个客户端:和。我希望客户端能够读取、写入和删除。客户端应该只能读取。 为什么不为此使用作用域?因为客户端的用户名和密码以及范围请求都是硬编码的。因此,理论上可以对其进行反编译,并更改

  • 问题内容: 我正在编写用于创建BigQuery和Google Cloud Storage授权的类。 在过去,我已经使用已被 弃用 。我正在尝试使用,但是我发现它只允许在需要使用时使用。 我知道一个可以转换到,但我不知道如何将它们转换成相反的方向(到)。例如,我正在这样创建我的连接: 谁能指出我的实现方向? 谢谢! 问题答案: 在大多数情况下,无论您在哪里使用,都可以使用。您只需要使用一点,那就是在

  • 问题内容: 将在官方网站上MongoDB的GUI客户端应用程序的列表已经过时:某些客户端不支持,有些是严重势必.NET和Linux上运行的不是。而且它们都缺乏编辑已存储文档的能力(即提供只读访问权限)。 我需要一个GUI客户端: 适用于Linux(但不适用于Web); 免费; 支持文档编辑。 是否有满足这些要求的应用程序? 问题答案: Robomongo-跨平台MongoDB GUI客户端 更新: