YouTube への動画のアップロードをすばやく実装できるシンプルなラッパー ライブラリに取り組んでいますが、問題に直面しました。ユーザーが選択できるアカウントにはいくつかの「タイプ」があります - 完全な Google 機能を備えた通常のアカウント、サービス アカウント ( https: //developers.google.com/youtube/v3/docs/errorsで、「youtubeSignupRequired」という単語を検索してください)、および一部の Google サービスへのアクセスが制限されている一部のビジネス アカウント。もちろん公式のドキュメントに頼るわけではなく、私なりの分類です。
そのため、ある時点で、ユーザーにアカウントを選択するように要求しています
private void selectAccountToLogin(Activity activity){
Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, "", null, null, null);
activity.startActivityForResult(intent, SELECT_ACCOUNT_REQUEST);
}
これらの行は、アカウントを選択するためのダイアログを作成するだけで、今はすべて問題ありません。次に、選択したアカウントのトークンを取得します。
String token = GoogleAuthUtil.getToken(activity, account, OAUTH_SCOPE);
重要 - すべての「タイプ」のアカウントのトークンを受け取りました (これは通常、Google サービスの一般的な認証手順によるものだと思います)。次に、自分の動画を YouTube にアップロードしたいのですが、ここに魔法がかかります。
1) 私の個人的な Gmail アカウントはすべて問題なく動作しています - ビデオは正常にアップロードされました。
2) ビジネス アカウント (YouTube にアクセスできない) の場合、401 を受け取りました
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
"code" : 401,
"errors" : [ {
"domain" : "global",
"location" : "Authorization",
"locationType" : "header",
"message" : "Invalid Credentials",
"reason" : "authError"
} ],
"message" : "Invalid Credentials"
}
403 ではなく 401 が表示されるのはなぜですか? (これはより修辞的な質問です) しかし、この時点ではすべてがそれほど悪くはありません:
3) サービス アカウントについても 401 を受け取りました。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
"code" : 401,
"errors" : [ {
"domain" : "youtube.header",
"location" : "Authorization",
"locationType" : "header",
"message" : "Unauthorized",
"reason" : "youtubeSignupRequired"
} ],
"message" : "Unauthorized"
}
したがって、2つの異なる理由で、同じ401を取得しました。もちろん、json応答のドメインとヘッダーパラメーターによってこれらの状況を区別できますが、私にとっては醜く不正確なアプローチです。
誰かがすでにこの問題に直面していて、より正確な方法で解決しているのではないでしょうか? 私が望むのは、状況に関する正確な情報を取得し、それをユーザーに提示することだけです。