如何在Youtube上上传视频使用refreshtoken在java



我正在尝试使用授权码上传视频到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");
    }

这是工作,用户必须验证每次当视频将被上传。现在我想上传视频使用accesstoken生成的refreshtoken,我已经有。但是需要在我的授权文件中集成LocalServerReceiver作为内部使用Jetty服务器。

我已经编写了从刷新令牌获取accesstoken的代码。请帮助我整合它。

 
 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;
    }

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

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

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

  1. 创建一个url,询问用户是否可以访问应用。
  2. 认证成功后,将接收到一个代码(jetty服务器实例将持续侦听,直到接收到该代码)。
  3. 将刚刚收到的代码与accesstoken和refreshtoken交换以进行离线上传。
  4. 存储我们刚刚从google收到的凭证。

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

  1. getAuthorizationFromStorage:从存储的凭据中获取访问令牌
  2. getAuthorizationFromGoogle:使用Google的凭证获取身份验证,创建将用户引导到身份验证页面的url,并在状态参数中创建自定义的名称-值对。该值应该用base64编码器编码,以便我们可以在身份验证后从google重定向接收相同的代码。
  3. saveAuthorizationFromGoogle:保存我们从google获得的凭据。
      对象创建GoogleAuthorizationCodeFlow对象credentialdatastor从google收到的响应之后身份验证。
  4. 点击google获取永久刷新令牌,可用于获取
  5. 将accesstoken和refreshtoken等令牌存储在文件名中userid

代码实现在这里

相关内容

  • 没有找到相关文章

最新更新