【问题标题】:Getting a OAuth2 authorization code that can be shared with a server获取可与服务器共享的 OAuth2 授权码
【发布时间】:2013-05-24 08:20:32
【问题描述】:

我的 Android 应用需要向我的服务器发送一个授权代码,以便服务器可以使用它来获取用户的 Google Drive 帐户的访问令牌。我一直在试图弄清楚如何获取授权码,我在 Google API 文档 (Using OAuth 2.0 for Installed Applications) 中找到了这个:

此序列首先重定向浏览器(系统浏览器或 作为 Web 视图嵌入到应用程序中)到具有一组 指示 Google API 访问类型的查询参数 应用程序需要。像其他场景一样,谷歌处理用户 身份验证和同意,但序列的结果是 授权码。授权码在标题中返回 浏览器的栏或作为查询字符串参数(取决于 请求中发送的参数)。

应用收到授权码后,可以兑换 访问令牌和刷新令牌的代码。应用程序 显示其 client_id 和 client_secret(在应用程序期间获得 注册)和本次交换期间的授权码。之上 收到刷新令牌,应用程序应将其存储为 未来使用。访问令牌使您的应用程序可以访问 Google API。

现在我不确定如何在我的 Android 应用程序中获取此授权代码,因为我看到的 Android 示例似乎直接获取了访问令牌。我正在查看 Android AccountManager 类,它有一个方法 getAuthToken 但这似乎是指访问令牌而不是授权代码。

那么如何获取可以与服务器共享的授权码呢?如果可能的话,我将不胜感激一些示例代码。如果这不可能,有哪些可能的解决方法?

【问题讨论】:

    标签: android oauth-2.0 google-drive-api google-oauth


    【解决方案1】:

    您可能想查看Cross-client Identity 文档。它应该使您无需来回传递用户令牌。

    【讨论】:

    • 这看起来很有希望!我会试一试,然后把结果发回这里。谢谢!我知道必须有一种方法可以干净地做到这一点。
    • 不过,看来我得等一会了:[注:此政策正在逐步推出。目前,当涉及访问令牌时,它仅适用于请求的范围包括“googleapis.com/auth/plus.login”]
    • 好吧,你总是可以把那个范围添加到你真正想要的范围内。
    【解决方案2】:

    我相信您实际上可以获取 Android AccountManager 返回的访问令牌,将其发送到您的服务器,然后让您的服务器使用相同的访问令牌对 Google Drive API 进行调用 - 它是一个不记名令牌,未绑定发送到创建它的频道,因此请妥善保管,仅通过加密连接发送。

    可以在此处找到有关如何获取该访问令牌的文档: https://developers.google.com/drive/quickstart-android

    虽然该访问令牌适合立即使用,但它会在 1 小时内过期,因此,如果您正在寻找一种解决方案,使您的后端服务器能够继续访问云端硬盘数据,而无需用户在场您的应用在请求时,将需要另一种方法。

    【讨论】:

    • 我实际上试过这个,但它不起作用。我不认为访问令牌和授权码是一回事。
    • 正确 - 它们不是一回事。授权代码由 Web 应用程序流返回,并一次性用于交换访问令牌(如果最初要求,则 + 刷新令牌)。但我不认为这就是我们在这里谈论的 - 这是访问令牌的可移植性 - 如果使用内置的 Android AccountManager 获取访问令牌,我不希望您的代码看到授权码。跨度>
    • 但显然服务器不能使用与客户端相同的访问令牌。它必须拥有自己的,如果客户端可以共享其授权代码,理论上它可以。看起来跨客户端身份技术可以解决这个问题,但我必须尝试一下才能确定。
    • 访问令牌是一个不记名令牌——这意味着它应该可以正常工作(我过去使用过这种技术就好了)——这并不是说没有更好的方法——交叉- 客户身份可能更优雅 - 我还没有研究过。
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2015-08-15
    • 2020-06-23
    • 2015-05-22
    • 2018-03-13
    • 2015-01-21
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多