一般来说,从 API V3 开始,Google 更喜欢 OAuth2 而不是其他机制,并且上传视频(或修改用户数据的任何其他操作)需要 OAuth2。
幸运的是,有一种特殊的令牌称为refresh token
来救援。刷新令牌不会像普通访问令牌那样过期,并且用于在需要时生成普通访问令牌。因此,我将我的申请分为两部分:
- 第一部分用于生成刷新令牌,这是一个 Java 桌面应用程序,旨在由用户在计算机上运行。See here https://github.com/googleads/googleads-java-lib/blob/master/examples/adwords_axis/src/main/java/adwords/axis/auth/GetRefreshToken.java来自 Google 的示例代码。
- 第二部分是我的 Web 应用程序的一部分,它使用给定的刷新令牌来创建凭证对象。
这是我在 Scala 中的实现,您可以轻松适应 Java 版本:
要生成刷新令牌,您应该将 accessType 设置为offline
用于授权流程。注意:如果您的系统上已经存在令牌,即使它没有刷新令牌,它也不会尝试获取新令牌,因此您还必须将批准提示设置为force
:
def authorize(dataStoreName: String, clientId: String, clientSecret: String): Credential = {
val builder = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT,
JSON_FACTORY,
clientId,
clientSecret,
Seq(YouTubeScopes.YOUTUBE_UPLOAD)
)
val CREDENTIAL_DIRECTORY = s"${System.getProperty("user.home")}/.oauth-credentials"
val fileDataStoreFactory = new FileDataStoreFactory(new java.io.File(CREDENTIAL_DIRECTORY))
val dataStore: DataStore[StoredCredential] = fileDataStoreFactory.getDataStore(dataStoreName)
builder.setCredentialDataStore(dataStore).setAccessType("offline").setApprovalPrompt("force")
val flow = builder.build()
val localReceiver = new LocalServerReceiver.Builder().setPort(8000).build()
new AuthorizationCodeInstalledApp(flow, localReceiver).authorize("user")
}
val credential = authorize(dataStore, clientId, clientSecret)
val refreshToken = credential.getRefreshToken
要在服务器上使用刷新令牌,您可以从刷新令牌构建凭据:
def getCredential = new GoogleCredential.Builder()
.setJsonFactory(JSON_FACTORY)
.setTransport(HTTP_TRANSPORT)
.setClientSecrets(clientId, clientSecret)
.build()
.setRefreshToken(refreshToken)