2

我正在开发一个简单的包装库,它可以快速实现将视频上传到 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"
}

为什么我得到 401 而不是 403 或其他?(这是一个更反问的问题)但此时一切都还不错:
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"
 }

因此,出于两个不同的原因,我得到了相同的 401。当然,我可以通过 json 响应中的域和标头参数来区分这些情况,但对我而言,这是一种丑陋且不准确的方法。
也许有人已经面临这个问题并以更准确的方式解决它?我想要的 - 获取有关情况的准确信息并将其呈现给用户。

4

0 回答 0