我正在处理的SpringWeb应用程序有一个身份验证服务。此身份验证服务对数据库中的用户进行身份验证,并在授权头中使用jwt承载令牌进行响应。此令牌将是应用程序中其他服务的访问令牌。
身份验证服务有2个筛选器。filter-1是扩展usernamepasswordauthenticationfilter的身份验证筛选器。认证成功后,它生成jwt承载令牌,并在响应中设置授权头。filter-2是验证jwt令牌的令牌验证筛选器(用于访问auth服务中的其他端点)。应用程序中的其他web服务也实现了此过滤器-2。
现在我想在auth服务中提供一个名为“/api/selfregister”的新端点。此端点的目的是gmail用户将自行注册,端点应返回字符串“welcome!!”响应还应包含jwt承载(由应用程序中的其他服务使用)
我已经配置了websecurityconfig,以便该端点将用户带到google登录页面。成功登录authenticationsuccesshandler()后,检查db是否将gmail用户作为注册用户。如果gmail用户不存在,将创建一个新的用户实体。新用户实体的角色为学生(用于授予的权限)。还将创建jwt承载令牌并将其添加到响应的授权头中。若gmail用户已经存在,那个么将从db获取用户角色,并创建一个新的jwt承载令牌,并将其添加到响应头中。
设置承载令牌后,我的期望是filter-2将成功处理请求和字符串“welcome!!”返回到浏览器。但是filter-2无法在授权头中找到jwt承载令牌,因此api调用未完成。浏览器中将显示一个空白页
问题1:我不确定重定向uri是否正确。在google开发者控制台中,我将重定向uri设置为http://localhost:8045/login/oauth2/code/google
问题2:这种为gmail用户创建jwt承载令牌的方法正确吗
网站安全配置。。。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtConfig, secretKey, loginService))
.addFilterAfter(new JwtTokenVerificationFilter(secretKey, jwtConfig), JwtAuthenticationFilter.class)
.authorizeRequests()
.antMatchers("/auth/login").permitAll()
.anyRequest()
.authenticated()
.and()
.oauth2Login()
.userInfoEndpoint()
.userService(oauthUserService)
.and()
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
CustomOAuth2User oauthUser = (CustomOAuth2User) authentication.getPrincipal();
googleOauthService.processOAuthPostLogin(oauthUser.getEmail(), response);
}
});
}
谷歌认证成功处理程序。。。
public void processOAuthPostLogin(String username, HttpServletResponse response) {
Optional<AppUserEntity> existUser = appUsersRepo.findByUsername(username);
AppUserEntity registeredUser = null;
if (!existUser.isPresent()) {
AppUserEntity newGmailUser = new AppUserEntity();
newGmailUser.setUsername(username); // This will be gmail id
newGmailUser.setAppUserRole(AppUserRole.STUDENT);
newGmailUser.setAuthProvider(AuthenticationProvider.GOOGLE);
newGmailUser.setEnabled(true);
newGmailUser.setLocked(false);
newGmailUser.setInstId(Long.valueOf(1)); // TODO hard coded instutute Id of Head Institute. Need better design
registeredUser = appUsersRepo.save(newGmailUser);
}else {
registeredUser = existUser.get();
}
generateToken(response, registeredUser);
}
public void generateToken(HttpServletResponse response, AppUserEntity registeredUser) {
RegisteredUserDao loggedInUserInfo = new RegisteredUserDao();
loggedInUserInfo.setInstId(registeredUser.getInstId());
loggedInUserInfo.setUsername(registeredUser.getUsername());
loggedInUserInfo.setUserRole(registeredUser.getAppUserRole().name());
String usersInstituteId;
String userId = registeredUser.getUserId().toString();
usersInstituteId = registeredUser.getInstId().toString();
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(AppUserRole.STUDENT.name()));
String token = Jwts.builder()
.setSubject(registeredUser.getUsername())
.claim("authorities", authorities)
.claim("userInstId", usersInstituteId)
.claim("userId", userId)
.setIssuedAt(new Date())
.setExpiration(java.sql.Date.valueOf(LocalDate.now().plusDays(jwtConfig.getTokenExpirationAfterDays())))
.signWith(secretKey)
.compact();
loginService.updateLoggedInUserEntity(registeredUser.getUsername(), token);
System.out.println("Adding token to response = "+token);
response.addHeader(jwtConfig.getAuthorizationHeader(), "Bearer " + token);
}
暂无答案!
目前还没有任何答案,快来回答吧!