itsource

스프링 부트 REST 응용 프로그램에서 Firebase를 사용하는 방법

mycopycode 2023. 3. 18. 08:37
반응형

스프링 부트 REST 응용 프로그램에서 Firebase를 사용하는 방법

Firebase에서 실행되는 인증에 의존하는 Spring Boot REST 어플리케이션을 사용하고 있습니다.

클라이언트 측에서 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?

Firebase와 Spring을 통합하기 위한 샘플 코드는 다음과 같습니다.

새로운 Admin SDK 에서는, 이하의 코드 스니펫을 사용하는 것만으로, 프로세스가 간단합니다.

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

상세한 것에 대하여는, 다음의 URL 를 참조해 주세요.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를 사용한 블로그 포스트의 완전한 조작: https://medium.com/techwasti/spring-boot-firebase-crud-b0afab27b26e

여기 내 질문에 대답하려는 나 자신의 시도가 있다.

@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.");

자세한 내용은http://https://firebase.google.com/docs/auth/admin/manage-users 를 참조해 주세요.

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>'

다음은 인증 및 인가 흐름 설정 방법에 대한 블로그 게시물입니다.

Firebase Auth and Spring Security 인증 (Sebastijan Grabar, 2021년 12월 13일)

레퍼런스

언급URL : https://stackoverflow.com/questions/39183107/how-to-use-firebase-with-spring-boot-rest-application

반응형