如何在 Java 中使用 refreshtoken 在 Youtube 中上传视频

Posted

技术标签:

【中文标题】如何在 Java 中使用 refreshtoken 在 Youtube 中上传视频【英文标题】:How to upload videos in Youtube using refreshtoken in java 【发布时间】:2017-01-27 06:03:15 【问题描述】:

我正在尝试使用授权码将视频上传到 Youtube。

    
public  Credential authorize(List scopes, String credentialDatastore) throws IOException, URISyntaxException 
        // Load client secrets.
        URI filePath = new URI (GOOGLE_APIKEY);
        Reader clientSecretReader =new InputStreamReader(new FileInputStream(filePath.toString()));

        //Reader clientSecretReader = new InputStreamReader(Auth.class.getResourceAsStream(GOOGLE_APIKEY));
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, clientSecretReader);



        // Checks that the defaults have been replaced (Default = "Enter X here").
        if (clientSecrets.getDetails().getClientId().startsWith("Enter")
                || clientSecrets.getDetails().getClientSecret().startsWith("Enter ")) 
            System.out.println(
                    "Enter Client ID and Secret from https://console.developers.google.com/project/_/apiui/credential "
                            + "into src/main/resources/client_secrets.json");
            System.exit(1);
        

        // This creates the credentials datastore at ~/.oauth-credentials/$credentialDatastore
        FileDataStoreFactory fileDataStoreFactory = new FileDataStoreFactory(new File(System.getProperty("user.home") + "/" + CREDENTIALS_DIRECTORY));
        DataStore datastore = fileDataStoreFactory.getDataStore(credentialDatastore);

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes).setCredentialDataStore(datastore).build();

        // Build the local server and bind it to port 8080
        LocalServerReceiver localReceiver = new LocalServerReceiver.Builder().setPort(8080).build();

        // Authorize.
        return new AuthorizationCodeInstalledApp(flow, localReceiver).authorize("user");
    

这是有效的,每次上传视频时用户都必须进行身份验证。 现在我想使用从我已经拥有的 refreshtoken 生成的 accesstoken 上传视频。 但需要集成到我的 Auth 文件中,该文件具有 LocalServerReceiver,因为在内部使用 Jetty 服务器。

我已经编写了从刷新令牌中获取访问令牌的代码。请帮我集成它。

 
 public GoogleCredential getCredentials(String clientId,String clientSecret,JsonFactory jsonFactory,HttpTransport transport,String refreshToken) throws IOException

        GoogleCredential credential = new GoogleCredential.Builder()
                .setClientSecrets(clientId, clientSecret)
                .setTransport(transport)
                .setJsonFactory(jsonFactory)
                .build();
        credential.setRefreshToken(refreshToken);

        // Do a refresh so we can fail early rather than return an unusable credential

            credential.refreshToken();
        String authCode=credential.getAccessToken();
        return credential;

    

【问题讨论】:

如果对您有帮助,请查看SO question。 我通过编写一个扩展 google 的 AuthorizationCodeInstalledApp 类的类克服了这个问题,并通过打破三种不同的方法来定制整个身份验证流程 1.getAuthorizationFromStorage 2.getAuthorizationFromGoogle 3.saveAuthorizationFromGoogle [实现代码] ( github.com/soumik-dutta/youtube-upload-javaAPI) 和[扩展类] (github.com/soumik-dutta/youtube-upload-javaAPI/blob/master/…) 如果你把它作为答案发布会更好:) 【参考方案1】:

在使用 google-java-api 上传 Youtube 视频时,我特别遇到了两个问题

    jetty server 实例的一个实例,该实例将持续监听,直到响应来自 Google,如重定向 URL 中所述。 虽然在 new LocalServerReceiver.Builder() 类中有一个名为 setHost() 的函数负责创建本地码头服务器实例,但每次给出主机名时都会出现 无法分配请求的地址错误无关紧要的端口。

整个授权过程在AuthorizationCodeInstalledApp类的authorize方法中完成,主要功能如下

    创建一个 url,要求用户授予对应用程序的访问权限。 认证成功后会收到一个code(jetty server的一个实例会持续监听直到收到code)。 用accesstoken和refreshtoken交换刚刚收到的code,进行离线上传。 存储我们刚刚从 google 收到的凭据。

为了解耦整个过程,我创建了一个新类ExtendedAuthorizationCodeInstalledApp,它扩展了原来的AuthorizationCodeInstalledApp,并为类中的每个函数创建了每个方法。方法如下

    getAuthorizationFromStorage :从存储的凭据中获取访问令牌。 getAuthorizationFromGoogle :使用来自 Google 的凭据获取身份验证创建 URL,该 URL 将引导用户进入身份验证页面并在 state 参数中创建自定义定义的名称-值对。该值应使用 base64 编码器进行编码,以便我们可以在身份验证后接收从 google 重定向的相同代码。 saveAuthorizationFromGoogle :保存我们从 google 获得的凭据。 从 credentialDatastor 来自 google 后收到的响应 身份验证。 打谷歌获取永久刷新令牌,可用于获取 用户随时的访问令牌。 将 accesstoken 和 refreshtoken 等令牌存储在文件名中 用户名

代码实现为here

感谢@KENdi 的建议...

【讨论】:

以上是关于如何在 Java 中使用 refreshtoken 在 Youtube 中上传视频的主要内容,如果未能解决你的问题,请参考以下文章

从保存的 refreshtoken (java) 中恢复 adwords api 的 oauth2 凭据

如何在客户端 Express 应用程序中处理 jwt 令牌和 refreshtoken?

如何存储 JWT refreshToken cookie 响应

使用拦截器获取refreshtoken后如何调用相同的请求?

Alamofire refreshToken with Retrier:如何获取 refreshToken 请求的状态并重新路由到 LoginView

如何在第二次尝试 refreshToken 时修复“格式错误的身份验证代码”?