用户通过登录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!
}
}
}
}