我正试图连接到google Contacts api以访问保存在google中的联系人/联系人,但它抛出了一个TokenResponseException:401 Unauthorized。我对谷歌Oauth2有些陌生。0.我已按要求将服务帐户密钥文件下载到我的项目根目录。
代码如下:
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.gdata.client.contacts.ContactsService;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;
public class Connector {
private static ContactsService contactService = null;
private static HttpTransport httpTransport;
private static final String APPLICATION_NAME = "example";
private static final String SERVICE_ACCOUNT_EMAIL = "example_mail@example-166608.iam.gserviceaccount.com";
private static final java.util.List<String> SCOPE = Arrays.asList("https://www.google.com/m8/feeds/");
private Connector() {
// explicit private no-args constructor
}
public static void main(String[] args) {
System.out.println(getInstance());
}
public static ContactsService getInstance() {
if (contactService == null) {
try {
contactService = connect();
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return contactService;
}
private static ContactsService connect() throws GeneralSecurityException, IOException {
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
java.io.File p12File = new java.io.File("example-e8135faedf4e.p12");
// @formatter:off
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JacksonFactory.getDefaultInstance())
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(SCOPE)
.setServiceAccountPrivateKeyFromP12File(p12File)
.setServiceAccountUser("example@gmail.com")
.build();
// @formatter:on
if (!credential.refreshToken()) {
throw new RuntimeException("Failed OAuth to refresh the token");
}
ContactsService myService = new ContactsService(APPLICATION_NAME);
myService.setOAuth2Credentials(credential);
return myService;
}
}
但是,会引发以下异常:
通用域名格式。谷歌。应用程序编程接口。客户啊。oauth2。TokenResponseException:401未经授权
null
在com上。谷歌。应用程序编程接口。客户啊。oauth2。TokenResponseException。来自com上的(TokenResponseException.java:105)。谷歌。应用程序编程接口。客户啊。oauth2。代币请求。executeUnparsed(TokenRequest.java:287)位于com.google.应用程序编程接口。客户啊。oauth2。代币请求。在com上执行(TokenRequest.java:307)。谷歌。应用程序编程接口。客户古格里皮斯。啊。oauth2。谷歌。executeRefreshToken(GoogleCredential.java:384)位于com.google.应用程序编程接口。客户啊。oauth2。资质在连接器上刷新令牌(Credential.java:489)。在连接器处连接(Connector.java:58)。连接器上的getInstance(Connector.java:31)。main(Connector.java:25)构建成功(总时间:9秒)
我发现您的代码与Quickstart示例中的代码基本相同。如果这至少奏效一次,请检查您是否有任何令牌保存在tokens文件夹下。
从这个相关线程来看,TokenResponseException
可能是由无效的客户机ID、客户机机密或作用域以及刷新令牌过度使用等许多原因造成的。这里还指出,“401未经授权”异常的另一个可能来源是离开凭证。refreshToken()
。调用是将访问代码写入引用所必需的。
可能也有帮助的其他参考: 401响应时,通过服务帐户和OAuth2到谷歌驱动器
我正在使用oauth 1.0,到目前为止,我可以成功地从谷歌获得访问令牌。但是当我想从https://www.google.com/m8/feeds/contacts/default/full检索用户联系人时,它返回401错误,没有进一步的解释。 我发现来自Google playground的信息可能不太准确,例如,步骤3和步骤5中的签名基本字符串包含oauth_version,但它是错误的。(如
我试图通过访问Google Admin SDK API来提取我域中的用户。但是,我被赋予了401未经授权的异常。下面的代码是我的设置类,其中包含我调用API的方法。 下面的代码是我用来从我的域中提取用户的测试用例: 最后,这是我面临的一个例外。 任何帮助都将不胜感激!!!
我是第一次使用谷歌API,我在尝试下载文件对象“下载Url”属性的文件时遇到问题。我当前正在使用“服务帐户”选项以及关联的服务帐户电子邮件和 P12 证书。 但是,URL返回“https://doc-08-68-docs.googleusercontent.com/docs/securesc/bteg36c1tifegg79l2ov17og25612tet/gk7kn52ahe4d0to7d6ht
我想使用谷歌驱动器作为一个网站的准CMS工作,我正在使内容所有者可以编辑他们的内容使用谷歌驱动器。我希望使用一个可以访问Google Drive的特定用户帐户(在写这篇文章时,服务帐户不能直接访问Google Drive),并且能够与内容所有者共享文档。 在阅读了API和教程之后,我在委托中找到了答案:https://developers.google.com/drive/development
我在写spring应用程序。我在我的项目中加入了招摇过市,但不知何故它无法正常运行。我的项目中也有带令牌的承载身份验证。请告诉我如何解决这个问题
我试着连接到谷歌云物联网MQTT Brocker。我没有被授权连接(5)作为Java客户端的异常。 使用以下回购的示例代码。https://github.com/googlecloudplatform/java-docs-samples/tree/master/iot/api-client/mqtt_example