登录Google登录后,检索用户内容



用户通过登录API签名:

https://developers.google.com/indistity/sign-in/android/start-integrating

已称为

然后您如何与Google API进行互动(例如YouTube API:https://developers.google.com/youtube/v3/docs/)

我会遇到一个错误,说"请求使用 mine 参数,但未正确授权。"我如何让我的YouTube API调用知道我已验证?

以下显示我的YouTube API调用:

val playlistsListByChannelIdRequest: YouTube.Playlists.List = youtube.playlists().list(part);
playlistsListByChannelIdRequest.setPart(part);
playlistsListByChannelIdRequest.setMine(true)
playlistsListByChannelIdRequest.setMaxResults(25);
playlistsListByChannelIdRequest.setKey(DeveloperKey.DEVELOPER_KEY)
val response: PlaylistListResponse = playlistsListByChannelIdRequest.execute();
playlists.addAll(response.items)

根据文档:

未经授权(401) - 授权授权 - 请求使用 mine 参数,但未正确授权

基于此线程:

mine 必须将参数值设置为true,以指示API仅返回身份验证的用户拥有的频道。(布尔)

推理:您没有内容所有者的内容授权,即YouTube频道所有者可能拒绝 通过访问频道内容来允许您的应用程序。

这是实施OAuth 2.0授权

的关键概念

YouTube数据API支持OAuth 2.0协议 授权访问私人用户数据。下面的列表解释了一些 核心OAuth 2.0概念:

  • 当用户首先尝试在您的应用程序中使用功能时,该功能需要登录用户到Google帐户或YouTube 帐户,您的申请启动OAuth 2.0授权 过程。
  • 您的应用程序将用户引导到Google的授权服务器。该页面的链接指定您的 scope 应用程序要求用户帐户。 scope 指定您的应用程序可以检索,插入的资源 更新,或在充当身份验证的用户时删除。
  • 如果用户同意授权您的应用程序访问这些资源,则Google将返回您的应用程序。根据 您的应用程序类型,它验证令牌或交换 对于不同类型的令牌。

以及如何获取它将在这里回答。

您的应用程序必须具有授权凭证才能使用 YouTube数据API。本文档描述了不同类型的 Google开发人员控制台的授权证书 支持。它还解释了如何查找或创建授权 您项目的凭据。

几天后,我弄清楚了这一点。秘密是创建一个用handlesignInrequest返回的帐户的凭证对象呼叫setSelectedAccount,并在初始化youtube对象时使用它。请参阅以下代码:

// Scope for accessing the user's youtube account
val YOUTUBE_SCOPE = "https://www.googleapis.com/auth/youtube";
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        val result: GoogleSignInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        handleSignInResult(result);
    }
}
// This happens as a result of using Google Sign-In in for the first time by selecting a user
fun handleSignInResult(result: GoogleSignInResult) : Unit {
    if (result.isSuccess()) {
        // Get the account from the sign in result
        val account: GoogleSignInAccount? = result.signInAccount
        if (account != null) {
            // Store the account from the result
            mAccount = account.getAccount()
            getSubscription()
        }
    }
}
private fun getSubscription() {
    GetSubscriptionTask(this, YOUTUBE_SCOPE).execute(mAccount)
}
/**
 * AsyncTask that uses the credentials from Google Sign In to access Youtube subscription API.
 */
private class GetSubscriptionTask(val context: Context, val YOUTUBE_SCOPE: String) : AsyncTask<Account, Unit, List<Subscription>>() {
    override fun doInBackground(vararg params: Account?): List<Subscription>? {
        // This part's misleading because it says "usingOauth2" even though we're using Google Sign-In
        val credential: GoogleAccountCredential = GoogleAccountCredential.usingOAuth2(
                context,
                Collections.singleton(this@GetSubscriptionTask.YOUTUBE_SCOPE));
        credential.setSelectedAccount(params[0]);
        // Global instance of the HTTP transport
        val HTTP_TRANSPORT: HttpTransport = AndroidHttp.newCompatibleTransport();
        // Global instance of the JSON factory
        val JSON_FACTORY: JsonFactory = JacksonFactory.getDefaultInstance();
        val youtube: YouTube = YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName("ChronoPlayer")
                .build();
        val connectionsResponse: SubscriptionListResponse = youtube
                .subscriptions()
                .list("snippet")
                .setMine(true)
                .execute();
        return connectionsResponse.getItems();
    }
    override fun onPostExecute(subscriptions: List<Subscription>): Unit {
        if (subscriptions != null) {
            // Get names of all connections
            for (sub in subscriptions) {
                // Got the subscriptions. Success!
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新