Spring Security :使用google oauth2 sso功能时jwt令牌验证过滤器不工作

mnowg1ta  于 2021-09-30  发布在  Java
关注(0)|答案(0)|浏览(189)

我正在处理的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);
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题