java—用于授权api请求的youtube帐户必须与用户的google帐户合并

yvt65v4c  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(460)

我知道这个问题以前被问过,这里有一个经过验证的答案,但这个解决方案对我不起作用。我想回复我的频道的评论从我的自定义软件。首先,我在googleconsole中创建了一个服务帐户,创建了一个密钥并下载了一个包含该密钥的文件(参见下面代码中的file.json)。我使用以下代码获得oauth2.0令牌:

try {
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream("file.json"))
                .createScoped(Collections.singleton(YouTubeScopes.YOUTUBE_FORCE_SSL));
        String token = credentials.refreshAccessToken().getTokenValue();

    } catch (IOException e) {
        e.printStackTrace();
    }

json文件来自google服务帐户控制台。它包括私钥、客户端id、客户端电子邮件和其他详细信息。这段代码一切正常,我成功地收到了访问令牌。但是当我试图发送一个HTTPPOST请求到https://youtube.googleapis.com/youtube/v3/comments?part=snippet 在这里解释了所需的json正文之后,我得到以下错误:

{
"error": {
    "code": 403,
    "message": "The YouTube account used to authorize the API request must be merged with the user's Google account.",
    "errors": [
        {
            "message": "The YouTube account used to authorize the API request must be merged with the user's Google account.",
            "domain": "youtube.comment",
            "reason": "ineligibleAccount",
            "location": "Authorization",
            "locationType": "header"
        }
    ]
}

}
提前谢谢。

rt4zxlrg

rt4zxlrg1#

我在googleconsole中创建了一个服务帐户
youtube api不支持服务帐户身份验证。使用oauth2创建桌面应用凭据和登录。
安装的应用程序的代码应该是这样的。

/**
   * Initializes an authorized YouTube service object.
   *
   * @return The YouTube  service object.
   * @throws IOException
   * @throws GeneralSecurityException
   */
  private static YouTube initializeYouTube() throws GeneralSecurityException, IOException {

    httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);

    // Load client secrets.
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
        new InputStreamReader(HelloYouTube.class
            .getResourceAsStream(CLIENT_SECRET_JSON_RESOURCE)));

    // Set up authorization code flow for all authorization scopes.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow
        .Builder(httpTransport, JSON_FACTORY, clientSecrets,
            YouTubeScopes.all()).setDataStoreFactory(dataStoreFactory)
        .build();

    // Authorize.
    Credential credential = new AuthorizationCodeInstalledApp(flow,
        new LocalServerReceiver()).authorize("user");
    // Construct the YouTube service object.
    return new YouTube.Builder(httpTransport, JSON_FACTORY, credential)
        .setApplicationName(APPLICATION_NAME).build();
  }

来自评论

我发现如果用户没有弹出窗口,就无法对youtubeapi进行身份验证,因为oauth2.0登录和您的示例都要求用户在弹出窗口中选择要进行身份验证的帐户。
不,youtube api没有其他选项。
我只是想澄清一下,我希望身份验证发生在幕后,用户可以通过验证预定义的凭据来发送回复。
我已经这样做了,然后您可以授权您的应用程序一旦存储刷新令牌,然后使用刷新令牌访问api在未来。
我想知道这是否可能。
至少要同意授权一次。

相关问题