我正在尝试使用授权码上传视频到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视频时遇到了两个特别的问题
- jetty server instance的实例,该实例将持续侦听,直到响应来自Google,如重定向url中所述。
- 虽然在
new LocalServerReceiver.Builder()
类中有一个名为setHost()
的函数,负责创建本地jetty服务器实例,但每次给出主机名时,都会出现无法分配请求的地址错误,无论端口如何。
整个授权过程是在AuthorizationCodeInstalledApp类的授权方法中完成的,其主要功能如下
- 创建一个url,询问用户是否可以访问应用。
- 认证成功后,将接收到一个代码(jetty服务器实例将持续侦听,直到接收到该代码)。
- 将刚刚收到的代码与accesstoken和refreshtoken交换以进行离线上传。
- 存储我们刚刚从google收到的凭证。
为了解耦整个过程,我创建了一个新类ExtendedAuthorizationCodeInstalledApp,它扩展了原始的AuthorizationCodeInstalledApp,并为类中的每个函数创建了每个方法。方法如下
- getAuthorizationFromStorage:从存储的凭据中获取访问令牌
- getAuthorizationFromGoogle:使用Google的凭证获取身份验证,创建将用户引导到身份验证页面的url,并在状态参数中创建自定义的名称-值对。该值应该用base64编码器编码,以便我们可以在身份验证后从google重定向接收相同的代码。
-
saveAuthorizationFromGoogle:保存我们从google获得的凭据。
- 对象创建GoogleAuthorizationCodeFlow对象credentialdatastor从google收到的响应之后身份验证。
- 点击google获取永久刷新令牌,可用于获取
- 将accesstoken和refreshtoken等令牌存储在文件名中userid
代码实现在这里