Android 上带有 OAuth2.0 的 Youtube 数据 API

Posted

技术标签:

【中文标题】Android 上带有 OAuth2.0 的 Youtube 数据 API【英文标题】:Youtube Data API with OAuth2.0 on Android 【发布时间】:2015-09-14 06:05:45 【问题描述】:

我正在尝试在 android 上使用 YouTubeData API 和 OAuth 2.0 身份验证,但我有点挣扎。

我在网上搜索了很多,但是对于Android的实现帮助不大。

首先,我不清楚获取 OAuth 令牌的最佳方式是什么。在文档中,他们建议对于 Android,最好使用 Google Play 服务库来获取它。真的吗?如果是,那么遵循本指南应该很简单:https://developers.google.com/android/guides/http-auth。 但此时我将在String 对象中拥有令牌.. 我应该如何将它与 YouTubeData API 一起使用?我应该把它放在YouTube.Builder 的某个地方吗?

YouTube youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, new HttpRequestInitializer() 
        public void initialize(HttpRequest request) throws IOException 
        
    ).setApplicationName("AppName").build();

如果有,有人知道在哪里吗?

在 *** 上搜索我遇到了这个问题:What to do after getting Auth Token - Android Youtube API。这里 Ibrahim Ulukaya 说最好使用GoogleAccountCredential。据我所知(Access to Google API - GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()),Android 版本的GoogleAccountCredential 应该使用 Google Play 服务库提供的GoogleAuthUtil,因此简化流程可能非常有用。我查看了 Ibrahim Ulukaya (https://github.com/youtube/yt-direct-lite-android) 建议的示例项目,并且我已经像他一样实现了所有内容。但它似乎不太好用,因为我只在 logcat 中获得这条消息:“出现 IO 错误:com.google.android.gms.auth.UserRecoverableAuthException:NeedPermission:null”。 (请注意,我已在 Google 控制台上启用了所有必需的 API,并为我的应用创建了客户端 ID)

在这一点上,我有点迷路了。 我应该直接使用 Google Play 服务库中的 GoogleAuthUtil 吗?在这种情况下,一旦获得了String 的令牌,我如何将它与 YouTubeData API 一起使用? 还是我应该使用 GoogleAccountCredential ?在这种情况下,有人知道我该如何解决“NeedPersmission:null”错误?

---- 编辑:

关于我的应用尝试做什么的详细信息:这是我第一次体验这种 API,我从简单的东西开始:检索视频信息,然后播放这些视频,无需任何用户身份验证.我很容易做到这一点,但为了我的应用程序的目的,我需要访问用户数据,特别是用户必须能够喜欢和评论视频。 所以我开始实现 OAuth2,尝试执行与之前相同的查询(检索视频信息)。

【问题讨论】:

【参考方案1】:

哇。这方面的文档非常令人困惑。完全披露,我不是 Android 开发人员,但我是一名 Java 开发人员,曾使用过 Google 应用和 OAuth2。

Google Play 还是不是 Google Play?首先,Google Play 服务只能在安装了 Google Play 服务的 Android 设备上使用(而不是 OUYA、Amazon 设备等)。 Google state“Google Play 库将为您提供最佳性能和体验。”。

来自实际 Android 开发人员的大量讨论(例如 here、here)列出了 Google Play 相对于其他技术的各种优点。我想,一旦您能够使用一种方法使您的应用程序工作,那么如果您愿意,它应该很容易改变。

关于使用 Android AccountManager 的大部分示例代码(任务和日历是最喜欢的示例),所以我将展示这些。

您的示例代码看起来可能是用于简单搜索,我猜想许多 YouTube API 交互不需要 OAuth2,在其他代码中我看到这个空的 HttpRequestInitializer 实现被称为无操作函数. (例如GeolocationSearch.java)。

听起来您想要访问需要帐户凭据的 YouTube API 操作。除了 YouTube 之外,您可以执行类似于此 Android 日历示例 (CalendarSampleActivity.java) 的操作,例如来自 here 的示例答案。

// Google Accounts
credential = GoogleAccountCredential.usingOAuth2(this, YouTubeScopes.YOUTUBE, YouTubeScopes.YOUTUBE_READONLY);
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
// YouTube client
service =
        new com.google.api.services.youtube.YouTube.Builder(transport, jsonFactory, credential)
            .setApplicationName("Google-YouTubeAndroidSample/1.0").build();

我希望这会有所帮助。

【讨论】:

嗨,这正是 Ibrahim Ulukaya (github.com/youtube/yt-direct-lite-android) 的示例所做的。它看起来确实是最好的解决方案。问题是我在 logcat 中收到此错误:“有一个 IO 错误:com.google.android.gms.auth.UserRecoverableAuthException:NeedPermission:null”,显然 API 不起作用。关于如何解决它的任何想法? ***.com/questions/14383965/… 我确定您知道这一点,但您的应用程序需要各种权限才能访问设备功能(例如 Internet!)并代表用户访问 YouTube。您需要的确切权限将根据您选择的身份验证机制而有所不同。请参阅链接的 Android 讨论,其中讨论了 GET_ACCOUNTS 和 USE_CREDENTIALS。你的清单是什么样的? (这可能值得作为一个单独的问题提出) 查看清单,例如github.com/youtube/yt-direct-lite-android/blob/master/app/src/… 您还需要包含您的开发人员 API 凭据,例如-***.com/questions/29656454/…。准确了解您的应用程序正在尝试做什么可能会有所帮助。 如果不看更多代码就很难诊断(你愿意把它放在 GitHub 上吗?)。您是否捕获了 UserRecoverableAuthIOException 并调用您的活动的 startActivityForResult?例如developers.google.com/api-client-library/java/… 和 github.com/youtube/yt-direct-lite-android/blob/master/app/src/… 我没有收到UserRecoverableAuthIOException,因此身份验证过程从未开始!非常感谢您的帮助和责任,现在我可以使用 OAuth2 进行身份验证并执行每个查询:)【参考方案2】:

在 HttpRequestInitializer 的初始化方法中,您可以设置请求的标头。根据 Google 的 Oath2 for devices https://developers.google.com/identity/protocols/OAuth2ForDevices 文档,如果您有访问令牌,则应将其放在 Authorization: Bearer HTTP 标头中。

YouTube youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, new HttpRequestInitializer() 
    public void initialize(HttpRequest request) throws IOException 
        request.put("Authorization", "Bearer " + yourAccessTokenString);
    
).setApplicationName("AppName").build();

记住授权头值中Bearer后面的空格

【讨论】:

我没有考虑过这个选项。你认为在这种情况下我必须自己处理刷新过程吗? 是的,如果您将令牌作为字符串获取并手动将其附加到请求中,您需要自己处理刷新过程。

以上是关于Android 上带有 OAuth2.0 的 Youtube 数据 API的主要内容,如果未能解决你的问题,请参考以下文章

安卓和 OAUTH 2.0

带有 OAuth2.0 的 Spring REST 不起作用

有人使用带有 OAuth2.0 身份验证系统的 node.js 吗? [关闭]

OAuth2.0部署不当,数十亿Android App账户存泄露风险

OAUTH2.0 不记名令牌不工作

Android Wear OAuth2.0 未收到刷新令牌