我使用的Angular 10与Spring Boot2.4。在前端,我希望能够进入设置页面,并有一个按钮登录到谷歌帐户(它不会用于应用程序登录)获得accesstoken和获取一些谷歌数据,如该用户的日历事件。目前,我正在调用一个后端api,它使用google客户端库来创建代码请求url,然后我将其发送回前端,然后用户被重定向到google登录页面。在用户登录到google之后,重定向uri是treigered,这也是另一个后端端点,在这里我将访问和刷新令牌保存到db。问题是,当登录成功时,客户端的用户不会得到通知,因为他只订阅了第一个端点,而没有订阅第二个端点来确认用户现在已登录。有没有什么简单的方法可以让客户端在第二个端点被触发时得到通知,或者我做的都是错的?
以下是我的端点的服务逻辑:
public String endpoint1(Long userId, HttpServletResponse response) {
try {
GoogleAuthorizationCodeRequestUrl authCodeUrl = new GoogleAuthorizationCodeRequestUrl(
googleAuthProps.getClientId(), getRedirectUri(), googleAuthProps.getScope()
);
authCodeUrl.setApprovalPrompt("force");
authCodeUrl.setAccessType("offline");
authCodeUrl.setState(userId);
return authCodeUrl.build();
} catch (Exception e) {
return null
}
}
public void endpoint2(HttpServletRequest request, HttpServletResponse response) {
try (FileInputStream inputStream = new FileInputStream("credentials.json")) {
String code = request.getParameterValues("code")[0];
Long userId = Long.valueOf(request.getParameterValues("state")[0]);
ClientId clientId = ClientId.fromStream(inputStream);
GoogleAuthorizationCodeTokenRequest tokenRequest = new GoogleAuthorizationCodeTokenRequest(
Utils.getDefaultTransport(), Utils.getDefaultJsonFactory(),
clientId.getClientId(), clientId.getClientSecret(), code, getRedirectUri());
GoogleTokenResponse tokenResponse = tokenRequest.execute();
if (tokenResponse != null) {
UserGoogleOAuth data = new UserGoogleOAuth();
data.setAccessToken(tokenResponse.getAccessToken());
data.setRefreshToken(tokenResponse.getRefreshToken());
data.setExpirationTime(Timestamp.valueOf(LocalDateTime.now().plusSeconds(tokenResponse.getExpiresInSeconds())));
data.setCreationTime(Timestamp.valueOf(LocalDateTime.now()));
data.setUserId(employeeId);
this.userGoogleOAuthRepository.save(data);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
在后端,我使用以下库:
com.google.api-client:google-api-client:1.31.1
com.google.apis:google-api-services-calendar:v3-rev411-1.25.0
com.google.auth:google-auth-library-oauth2-http:0.22.1
这是我如何从angular调用endpoint1的:
logInToGoogle(): void {
this.userGoogleProvider.logInToGoogle(currentUserId)
.subscribe(url => window.open(url, '_blank'));
}
暂无答案!
目前还没有任何答案,快来回答吧!