【发布时间】:2020-03-11 09:44:40
【问题描述】:
我正在尝试构建一个使用一些基本谷歌日历 API 的小型应用程序。由于生成的访问令牌每 60 分钟过期一次,因此我想自动调用刷新访问令牌 api 并将旧的访问令牌替换为新的访问令牌。
为此,我调用以下 api:
POST /o/oauth2/token?client_id={clientId}
&client_secret={secret}
&grant_type=refresh_token
&access_type=offline
&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar
&refresh_token={refreshToken} HTTP/1.1
Host: accounts.google.com
User-Agent: PostmanRuntime/7.19.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 4a8e2563-4e31-431d-9e19-a442fb419590,1f750768-a6f5-42de-9f52-05555ac79c01
Host: accounts.google.com
Accept-Encoding: gzip, deflate
Content-Length: 0
Connection: keep-alive
cache-control: no-cache
我尝试从邮递员那里调用这个 api,它工作得很好,但是当我通过 Spring boot 尝试同样的操作时,我收到 400 Bad Request 错误。下面是我用来测试不同场景的代码。
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Accept", "*/*");
requestHeaders.add("Host", "accounts.google.com");
//requestHeaders.add("User-Agent", "HTTPie/0.6.0");
requestHeaders.add("Accept-Encoding", "*/*");
requestHeaders.add("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
String REFRESH_TOKEN_URL = "https://accounts.google.com/o/oauth2/token?"+
"client_id={exact same client id}" +
"&client_secret={exact same client secret}" +
"&grant_type=refresh_token" +
"&access_type=offline" +
"&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" +
"&refresh_token={exact same refresh token}";
ResponseEntity<Object> response = restTemplate.exchange(REFRESH_TOKEN_URL, HttpMethod.POST, requestEntity, Object.class);
我不知道我在这里做错了什么。 请帮我解决这个问题(我已经被困了超过 1 天)。
P.S : 我可能必须将此代码集成到我公司的产品中,并且无法使用 google 客户端 sdk。这就是我尝试探索 api 选项的原因。
【问题讨论】:
标签: java spring-boot google-api google-calendar-api google-authentication