带有facebook过滤器和JWT的Spring SSO

时间:2017-05-18 09:50:27

标签: spring oauth-2.0

这是我的问题。 我通过邮件和JWT获得了第一次使用Spring boot 1.5.3进行身份验证。 =>工作得很好 然后我做了一个SSO过滤器来允许facebook令牌 问题是,在第一次认证时它没问题。我的服务器获取令牌,然后用fb检查说好,然后它对我的客户说好。 之后如果我不使用我的JWT令牌增强器编码我的令牌,我的服务器说它无法将其解码为JSON。 只是我知道,我通常不需要编码自己,因为它应该在我的链过滤后自动完成,如果我说好的话?

此代码有效,但我自己完成了jwt,可能我错过了什么????

public class MyOAuth2ClientAuthenticationProcessingFilter  extends    OAuth2ClientAuthenticationProcessingFilter {

    public MyOAuth2ClientAuthenticationProcessingFilter(String defaultFilterProcessesUrl) {
        super(defaultFilterProcessesUrl);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException, IOException, ServletException {
        log.info("[attemptAuthentication facebook]");
        Authentication result = null;
        try {
            String token = request.getHeader("oauth_token");
            oauth2ClientContext.setAccessToken(new DefaultOAuth2AccessToken(token));
            result = super.attemptAuthentication(request, response);
            if(result.isAuthenticated()) {
                FacebookService facebookService = new BasicFacebookService(token);
                User fbUser = facebookService.getUser();
                if(fbUser == null) {
                    throw new IllegalArgumentException(" fb user cannot be null");
                }
                if(!userService.isLoginExists(fbUser.getId())) {
                    CreateSocialUserModel model = new CreateSocialUserModel(
                            token,
                            DateUtil.getNow(),
                            "facebook");
                    userService.createSocialUser(model, fbUser);
                }
                //--- Create custom JWT token from facebook token
                UserInfoTokenServices tokenService = new UserInfoTokenServices(
                        "https://graph.facebook.com/me",
                        facebookProperties.getAppId());
                OAuth2AccessToken enhancedToken = jwtTokenEnhancer.enhance(oauth2ClientContext.getAccessToken(),
                        tokenService.loadAuthentication(oauth2ClientContext.getAccessToken().getValue()));
                TokenResponse tokenResponse = new TokenResponse(enhancedToken.getValue(),
                        enhancedToken.getTokenType(),
                        enhancedToken.getRefreshToken() != null ? enhancedToken.getRefreshToken().getValue() : "");

                ObjectMapper mapper = new ObjectMapper();
                String jsonTokenEnhancedJack = mapper.writeValueAsString(tokenResponse);
                response.addHeader("Content-Type", "application/json");
                response.getWriter().flush();
                response.getWriter().print(jsonTokenEnhancedJack);
            }
            return result;
        }  catch (Exception e) {
            log.info("error");
            log.error("error", e);
            e.printStackTrace();
        }  finally {
            return result;
        }
    }
}

提前谢谢

1 个答案:

答案 0 :(得分:1)

正如Son Goku所说,只是提供一些代码来帮助他

首先,您必须像这样放置过滤器

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/**")
            .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class)
            .authorizeRequests()
            .anyRequest().permitAll()
            .and().csrf().disable();
}

private Filter ssoFilter() {
    OAuth2ClientAuthenticationProcessingFilter facebookFilter = new MyOAuth2ClientAuthenticationProcessingFilter("/user/social");
    OAuth2RestTemplate facebookTemplate = new OAuth2RestTemplate(Oauth2facebook(), oauth2ClientContext);
    facebookFilter.setRestTemplate(facebookTemplate);
    facebookFilter.setTokenServices(new UserInfoTokenServices(
            "https://graph.facebook.com/me",
            facebookProperties.getAppId()
    ));
    return facebookFilter;
}

之后,您可以在第一个问题中使用OAuth2ClientAuthenticationProcessingFilter。 此外,在第一个问题我定制了很多这个方法,它的工作原理,但我很惊讶,没有发现这就像这些库使用一样简单。 希望它对你有所帮助,我在这方面也有点挣扎。 也许现在,春季靴子更容易处理。