【问题标题】:Exception: 401 Unauthorized Error | com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized异常:401 未经授权的错误 | com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
【发布时间】:2017-03-16 19:46:41
【问题描述】:

我的代码: GoogleCredential 凭据

    try {
        // Authorize the request.
        credential = new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(serviceAccId)
                .setServiceAccountPrivateKeyFromP12File(certFilePath)
                .setServiceAccountScopes(Lists.newArrayList(YouTubeScopes.YOUTUBE))
                .setServiceAccountUser(emailId)
                .build();

credential.refreshToken()

错误日志:

Error |
Exception: 401 Unauthorized
Error |
com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
Error |
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
Error |
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
Error |
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
Error |
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
Error |
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
Error |
    at com.google.api.client.auth.oauth2.Credential$refreshToken.call(Unknown Source)
Error |
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
Error |
    at viewlift.YouTubePublishService.authorizeCredentials(YouTubePublishService.groovy:82)
Error |
    at viewlift.YouTubePublishService$$FastClassBySpringCGLIB$$48c3206b.invoke(<generated>)
Error |
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
Error |
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708)
Error |
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
Error |
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
Error |
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
Error |
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
Error |
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
Error |
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
Error |
    at viewlift.YouTubePublishService$$EnhancerBySpringCGLIB$$6e11774.authorizeCredentials(<generated>)
Error |
    at viewlift.YouTubePublishService$authorizeCredentials.call(Unknown Source)
Error |
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
Error |
    at com.viewlift.ViewLiftUtilsService.createSocialAccount(ViewLiftUtilsService.groovy:128)
Error |
    at com.viewlift.ViewLiftUtilsService$$FastClassBySpringCGLIB$$53f6d4a5.invoke(<generated>)
Error |
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
Error |
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708)
Error |
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
Error |
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
Error |
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
Error |
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
Error |
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
Error |
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)

我创建服务帐户的步骤:

  1. 我在 oauth 2.0 的凭据中创建了一个 Web 应用程序
  2. 然后我获取了客户端 ID,并以此创建了一个服务帐户
  3. 现在我正在使用此服务帐户和由此生成的 p12 证书来验证和创建 GoogleCredentials 对象
  4. 只要刷新令牌,我就给了我 401 异常。

在这种情况下,任何帮助将不胜感激

【问题讨论】:

    标签: java google-api youtube-api google-api-java-client service-accounts


    【解决方案1】:

    YouTube API 不支持服务帐户身份验证。

    您需要切换到 Oauth2 并对您的代码进行一次身份验证,然后保存刷新令牌以供以后使用。刷新令牌可能会过期,但它不会那么频繁,但如果它确实过期,您将不得不观察它并重新验证您的代码。

    YouTube Data API 支持 OAuth 2.0 协议进行授权 访问私人用户数据。

    服务帐户流支持服务器到服务器的交互, 不要访问用户信息。但是,YouTube 数据 API 支持这个流量。由于无法将服务帐户链接到 YouTube 帐户

    【讨论】:

    • 目前我正在使用我配置的服务帐户仅用于访问 youtube 帐户。我不同意你的回答。只是我无法以相同的方式配置另一个帐户。我早期的帐户能够给我带来视频并对其进行操作。但是这个新帐户没有正确配置。我只使用 OAUTH 2.0。据我所知,上述程序是 OAUTH 2.0。
    • 我的引述直接来自 Google 的文档。 “YouTube 数据 API 不支持此流程。因为无法将服务帐户链接到 YouTube 帐户。”祝您在做一些被记录为不受支持的事情时好运。
    • setServiceAccountPrivateKeyFromP12File(certFilePath)
    • 旁注:您确定应该使用 YouTubePublish 吗? developers.google.com/youtube/2.0/…
    • 我阅读了文档,并没有写在那里如何做到这一点,虽然我能够更早地实现它,但这次我失败了。这就是我来堆栈溢出的原因。 YouTubePublish 是一个内部类。它与 API 类无关。
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2020-03-29
    • 2017-12-20
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多