如何将 Firebase 与 Spring Boot REST 应用程序一起使用?

Posted

技术标签:

【中文标题】如何将 Firebase 与 Spring Boot REST 应用程序一起使用?【英文标题】:How to use Firebase with Spring boot REST Application? 【发布时间】:2017-01-04 02:50:54 【问题描述】:

我有一个 Spring Boot REST 应用程序,它依赖于 Firebase 中完成的身份验证。

在客户端 Firebase 生成一个令牌,在 Spring Boot 中,我需要验证 UID

但是代码是回调模式,如何实现函数才能完成任务呢?

@RequestMapping(value = "/api/restCall", method = RequestMethod.POST, 
             consumes = "application/json", produces = "application/json")
public Object restCall(@RequestBody Parameters requestBody) throws Exception 
    String idToken = requestBody.getToken();
    Task<FirebaseToken> task = FirebaseAuth.getInstance().verifyIdToken(idToken)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() 
            @Override
                public void onSuccess(FirebaseToken decodedToken) 
                    String uid = decodedToken.getUid();
                
            );
    return "???"; // what return here?

onSuccess 之后如何返回? DeferredResult?

【问题讨论】:

【参考方案1】:

要将 Firebase 与 Spring 集成,下面是示例代码

在新的 Admin SDK 中,过程很简单,只需使用下面的代码 sn-p。

FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");

更多详情请访问此网址https://firebase.google.com/docs/auth/admin/manage-users

这是用于遗留代码。 首先添加Firbase依赖

<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-server-sdk</artifactId>
    <version>3.0.1</version>
</dependency>

示例代码

@Component
public class FirebaseAuthenticationProvider implements AuthenticationProvider 

    @Autowired
    @Qualifier(value = UserServiceImpl.NAME)
    private UserDetailsService userService;

    public boolean supports(Class<?> authentication) 
        return (FirebaseAuthenticationToken.class.isAssignableFrom(authentication));
    

    public Authentication authenticate(Authentication authentication) throws AuthenticationException 
        if (!supports(authentication.getClass())) 
            return null;
        

        FirebaseAuthenticationToken authenticationToken = (FirebaseAuthenticationToken) authentication;
        UserDetails details = userService.loadUserByUsername(authenticationToken.getName());
        if (details == null) 
            throw new FirebaseUserNotExistsException();
        

        authenticationToken = new FirebaseAuthenticationToken(details, authentication.getCredentials(),
                details.getAuthorities());

        return authenticationToken;
    


完整的例子请通过下面的github链接 https://github.com/savicprvoslav/Spring-Boot-starter 使用 CRUD 操作完成 BlogPost: https://medium.com/techwasti/spring-boot-firebase-crud-b0afab27b26e

【讨论】:

此 API 现在已弃用,取而代之的是新的 Firebase Admin-SDK。您可能想要更新您的代码。 GitHub 源代码非常有用,但一些见解肯定会有用。我有项目设置,但我无法访问或使用任何 API ..【参考方案2】:

这是我自己尝试回答我自己的问题

@RequestMapping(value = "/api/restCall", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public Object restCall(@RequestBody Parameters requestBody,@RequestHeader(value = FIREBASETOKEN, required = true) String idToken) throws Exception 

    // idToken comes from the HTTP Header
    FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdTokenAsync(idToken).get();
    final String uid = decodedToken.getUid();

    // process the code here
    // once it is done
    return object;


你也可以试试下面的代码

FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");

更多详情URLhttps://firebase.google.com/docs/auth/admin/manage-users

【讨论】:

这不是春天的方式。 如何发送来自 HTTP Header 的 idToken,您能指导一下吗? 只需设置任何 HTTP 属性,并通过请求标头读取它。请注意,这只是推荐的方法之一。【参考方案3】:

要将 Firebase 与 Spring 集成,您实际上只需将 Spring 应用配置为资源服务器并提供一个 URL,用于下载验证的公钥。

依赖关系

dependencies 
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'

application.yaml文件:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
          issuer-uri: https://securetoken.google.com/$FIREBASE_APP_NAME

启用http.oauth2ResourceServer().jwt()

@RestController
@SpringBootApplication
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

    @GetMapping(path = "/user")
    public String test(Principal principal) 
        return principal.getName();
    

    @Configuration
    public static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter 
        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http.authorizeRequests().anyRequest().authenticated();
            http.oauth2ResourceServer().jwt();
        
    


然后你可以只使用 Firebase 提供的令牌进行身份验证:

curl --location --request GET 'http://localhost:8080/user' \
--header 'Authorization: Bearer <TOKEN>'

这是一篇关于如何设置身份验证和授权流程的精彩博文:

Authentication with Firebase Auth and Spring Security (Sebastijan Grabar, Dec 13, 2021)

参考文献

Spring Security - How JWT Authentication Works JWS + JWK in a Spring Security OAuth2 Application

【讨论】:

以上是关于如何将 Firebase 与 Spring Boot REST 应用程序一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot实战05:Spring Boo多环境配置及配置属性注入到对象

spring boo的简单搭建(eclipse+springboot + redis + mysql + thymeleaf)

如何将 Flutter Web 与 Firebase 集成? [关闭]

如何将 Google Play 游戏登录与 Firebase 身份验证结合使用

如何将 Flutter Bloc 与 Firebase 电话身份验证一起使用

如何将自定义参数与保留事件一起发送到 Firebase 分析