gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:08:58 25 4
gpt4 key购买 nike

我已经使用 Firebase 身份验证 token (JWT) 验证对 API 的访问权限,该 token 作为承载 token 在 Http 授权 header 内传递。使用自动配置可以很好地工作。现在我想从身份验证映射到数据库中的用户记录。我需要如何调整安全过滤器链?此配置由 Spring Boot 根据 docs 自动应用并且可以被覆盖:

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().anyRequest().authenticated()
.and().oauth2ResourceServer().jwt();
}

我正在使用 Firebase 身份验证 UI 插入解决方案,该解决方案在成功进行身份验证时提供访问 token 。然后这个 token 被传递到我的 API。

最佳答案

您可能需要做一些事情:

  1. 编写一个安全过滤器来调用 FirebaseAuth 对承载 token 进行身份验证。 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);
}
}
  • 您将需要 UserDetailsS​​ervice 的实现,我相信您已经有了。

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

  • @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));
    }

    }

    希望以上有帮助。

    关于java - 使用 Firebase Auth 在 Spring 中对 API 请求进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57707204/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com