为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Firebase Auth 在 Spring 中对 API 请求进行身份验证

使用 Firebase Auth 在 Spring 中对 API 请求进行身份验证

慕莱坞森 2023-06-28 15:32:34
我已经使用 Firebase 身份验证令牌 (JWT) 验证对 API 的访问权限,该令牌作为承载令牌在 Http 授权标头内传递。使用自动配置可以很好地工作。现在我想从身份验证映射到数据库中的用户记录。我需要如何调整安全过滤器链?此配置由 spring boot 根据文档自动应用,并且可以被覆盖:@Overrideprotected void configure(HttpSecurity http) throws Exception {    http            .authorizeRequests().anyRequest().authenticated()            .and().oauth2ResourceServer().jwt();}我正在使用 Firebase 身份验证 UI 插入解决方案,该解决方案在成功身份验证时提供访问令牌。然后这个令牌被传递到我的 API。
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您可能需要做一些事情:

  1. 编写一个安全过滤器来调用 FirebaseAuth 对 Bearer Token 进行身份验证。令牌经过身份验证后,将其放入 SecurityContext 中。类似于:

public class FirebaseFilter extends OncePerRequestFilter {


    private static String AUTH_HEADER = "Authorization";


    @Override

    protected void doFilterInternal(HttpServletRequest request,

                                    HttpServletResponse response,

                                    FilterChain filterChain) throws ServletException, IOException {


        String authToken = request.getHeader(AUTH_HEADER).substring(7);

        if (!StringUtils.isEmpty(authToken)) {

            Authentication auth = getAuthentication(authToken);

            SecurityContextHolder.getContext().setAuthentication(auth);

            logger.debug("Successfully Authenticated");

        }

        filterChain.doFilter(request, response);


    }


    private FirebaseToken verifyIdToken(String idToken) {

        if (StringUtils.isEmpty(idToken)) {

            throw new IllegalArgumentException("idToken is blank");

        }

        return FirebaseAuth.getInstance().verifyIdToken(idToken);

    }


    private Authentication getAuthentication(String idToken) {


        FirebaseToken token = verifyIdToken(idToken);

        assert token != null;

        return new FirebaseAuthenticationToken(token.getUid(), token);

    }

}

您将需要 UserDetailsService 的实现,我相信您已经有了。


您将需要一个安全提供程序,它从安全上下文中获取身份验证,然后调用 UserDetailsService 来获取应用程序可能需要的任何信息。然后更新认证对象。类似于:


@Component

public class FirebaseAuthenticationProvider implements AuthenticationProvider {


    private UserService userService;


    @Autowired

    public FirebaseAuthenticationProvider(UserService userService) {

        this.userService = userService;

    }


    public Authentication authenticate(Authentication authentication) throws AuthenticationException {

        if (!supports(authentication.getClass())) {

            return null;

        }


        UserDetails details = userService.loadUserByUsername(authentication.getPrincipal()

                                                                           .toString());

        FirebaseToken token = (FirebaseToken) authentication.getCredentials();

        if (details == null) {


            details = userService.registerUser(token);

        }


        return new FirebaseAuthenticationToken(details, token, details.getAuthorities());

    }


    public boolean supports(Class<?> authentication) {

        return (FirebaseAuthenticationToken.class.isAssignableFrom(authentication));

    }


}


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信