我正在开发一个简单的包装库,它可以快速实现将视频上传到 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 响应中的域和标头参数来区分这些情况,但对我而言,这是一种丑陋且不准确的方法。
也许有人已经面临这个问题并以更准确的方式解决它?我想要的 - 获取有关情况的准确信息并将其呈现给用户。