微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Security:使用 Google OAuth2 SSO 功能时 JWT 令牌验证过滤器不起作用

如何解决Spring Security:使用 Google OAuth2 SSO 功能时 JWT 令牌验证过滤器不起作用

我正在开发的 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 不记名令牌的正确方法

WebSecurityConfiguration ...

@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 举报,一经查实,本站将立刻删除。