如何在 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