问题描述
我正在开发的 Spring Web 应用程序具有身份验证服务。 此身份验证服务对数据库中的用户进行身份验证,并在授权标头中使用 JWT 不记名令牌进行响应。 此令牌将成为应用程序中其他服务的访问令牌。
Auth 服务有 2 个过滤器。 Filter-1 是扩展 UsernamePasswordAuthenticationFilter 的身份验证过滤器。 身份验证成功后,它会生成 JWT 不记名令牌并设置授权标头作为响应。 Filter-2 是令牌验证过滤器,用于验证 JWT 令牌(用于访问 Auth 服务中的其他端点)。 应用程序中的其他 Web 服务也实现了这个 Filter-2。
现在我想在身份验证服务中提供一个名为“/api/selfregister”的新端点。 此端点的目的是让 gmail 用户自行注册,并且端点应返回字符串“欢迎!!” 响应还应包含 JWT 承载(供应用程序中的其他服务使用)
我已配置 WebSecurityConfig,以便此端点将用户带到 Google 登录页面。 成功登录 AuthenticationSuccessHandler() 后, 检查数据库是否有 gmail 用户作为注册用户。如果 gmail 用户不存在,则会创建一个新的用户实体。 新用户实体的角色是 STUDENT(用于授权机构)。 还会创建 JWT 不记名令牌并将其添加到响应的授权标头中。 如果 gmail 用户已经存在,则从数据库中获取用户的角色,并创建一个新的 JWT 不记名令牌并将其添加到响应标头中。
设置不记名令牌后,我的期望是 Filter-2 将成功处理请求和字符串“欢迎!!”返回给浏览器。 但是 Filter-2 无法在 Authorization 标头中找到 JWT 不记名令牌,因此未完成 api 调用。浏览器出现空白页面
问题 1:我不确定重定向 uri 是否正确。 在 Google Developers Console 中,我已将重定向 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);
}
});
}
Google 身份验证成功处理程序 ...
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);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)