백엔드 Go 애플리케이션에서 Firebase Authentication 사용자 지정
개시하다
응용 프로그램은 전단과 후단에 각각 독립된 응용 프로그램을 만들어서 하나의 응용 프로그램을 구성할 수 있다.
이 글은 이러한 구성의 전단에서Firebase Authentication을 사용하여 사용자 인증을 하는 경우 후단의 Go 응용 프로그램에서도 현재 로그인한 사용자를 확인하는 방법을 설명합니다.
만약 이 보도가 다른 사람의 참고가 된다면 정말 좋겠다.
또한 이 보도의 내용에 잘못된 기록이 있다면 지적해 주십시오.
컨디션
이름:
릴리즈
macOS Monterey
12.2.1
Go
1.17.6
Firebase Admin Go SDK
4.6.0
개요
Firebase Admin SDK를 사용하여 백엔드 서버에서 현재 로그인한 사용자를 확인합니다.Admin SDK를 사용하여 Firebase Authentication을 독립 실행형 서버와 병합하거나 사용자 또는 인증 토큰을 관리할 수 있습니다.
백엔드 서버에서 사용자를 지정하는 대략적인 절차는 다음과 같다.
설치 단계
서비스 계정 만들기
Firebase Admin SDK를 사용하려면 서비스 계정으로 Admin SDK를 초기화해야 합니다.따라서 서비스 계정을 만들고 서비스 계정 파일을 받습니다.서비스 계정 파일은 인증 정보를 포함하는 JSON 파일입니다.
콘솔에서 [프로젝트 설정][서비스 계정]을 엽니다.그런 다음 Firebase Admin SDK의 [새 비밀 키 생성], [키 생성]을 클릭하여 만듭니다.만들어진 서비스 계정 파일은 공개되지 않으며 안전하게 보관됩니다.
Admin SDK 초기화
백엔드 Go 애플리케이션을 사용하여 Admin SDK를 초기화합니다.
먼저 다음 명령을 사용하여 SDK를 설치합니다.
go get firebase.google.com/go/v4
서비스 계정 파일을 사용하여 Admin SDK를 초기화합니다.초기화 방법은 다음과 같은 세 가지가 있다.GOOGLE_APPLICATION_CREDENTIALS
를 활용하는 방법1. 환경 변수 GOOGLEAPPLICATION_CREDENTIALS 활용 방법
이 방법은 공식 문서에서 추천한 방법이다.환경 변수
GOOGLE_APPLICATION_CREDENTIALS
에 서비스 계정 파일의 파일 경로를 설정합니다.export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
그리고 Go 응용 프로그램은 다음과 같이 초기화됩니다.app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
// エラー処理
}
2. 코드에 서비스 계정 파일의 경로를 명확하게 쓰는 방법
이 방법은 환경 변수를 지정하지 않고 서비스 계정 파일의 파일 경로를 원본 코드에 삽입합니다.
opt := option.WithCredentialsFile("path/to/service-account-file.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
// エラー処理
}
3. 환경 변수에 JSON 파일을 포함시키는 방법
이 방법은 jq 명령 등을 이용하여 JSON 파일을 한 줄 문자열로 변환하고 이 문자열을 환경 변수로 설정합니다.그런 다음 응용 프로그램이 환경 변수에서 JSON 파일의 내용을 읽고 초기화합니다.
다음 예에서는 환경 변수
GOOGLE_CREDENTIALS_JSON
에 JSON 파일의 내용을 설정합니다.opt := option.WithCredentialsJSON([]byte(os.Getenv("GOOGLE_CREDENTIALS_JSON")))
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
// エラー処理
}
참조: 서버에 Firebase Admin SDK 추가ID 토큰 확인
초기화 후
VerifyIDToken
방법으로 ID 토큰을 확인합니다.client, err := app.Auth(ctx)
if err != nil {
// エラー処理
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
// エラー処理
}
log.Printf("User ID: %v\n", token.UID)
VerifyIDToken
방법의 반환값token
은 auth.Token형의 값이다.사용자 ID가 있는 UID 필드 등 사용자별로 해당 UID 필드의 값을 사용합니다.
구체적인 실시 예
다음은 Go로 작성된 REST API의 설치 예입니다.
firebase.go
에서는 Admin SDK의 초기화 및 사용 함수를 정의합니다.인터페이스
firebaseAppInterface
는 테스트 시 모듈firebaseApp
에 사용됩니다.firebase.go
// 省略
type firebaseAppInterface interface {
VerifyIDToken(ctx context.Context, idToken string) (*auth.Token, error)
}
type firebaseApp struct {
*firebase.App
}
func InitFirebaseApp() (*firebaseApp, error) {
app, err := firebase.NewApp(context.Background(), nil, option.WithCredentialsJSON([]byte(os.Getenv("GOOGLE_CREDENTIALS_JSON"))))
if err != nil {
// エラー処理
}
return &firebaseApp{app}, nil
}
func (app *firebaseApp) VerifyIDToken(ctx context.Context, idToken string) (*auth.Token, error) {
client, err := app.Auth(ctx)
if err != nil {
// エラー処理
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
// エラー処理
}
return token, nil
}
// 省略
다음 auth.go
은 실제 사용자 특정 처리를 하는 중간부품을 정의합니다.URL
/health
의 끝점에 대해 사용자 지정이 필요하지 않으므로 반환 중입니다.auth.go
// 省略
type userKey struct{}
func Auth(db dbInterface, firebaseApp firebaseAppInterface) func(handler http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/health" {
next.ServeHTTP(w, r)
return
}
ctx := r.Context()
if !strings.HasPrefix(r.Header.Get("Authorization"), "Bearer ") {
// Authorization ヘッダのフォーマットが適切でない
}
idToken := strings.Split(r.Header.Get("Authorization"), " ")[1]
token, err := firebaseApp.VerifyIDToken(ctx, idToken)
if err != nil {
// エラー処理
}
user, err := db.GetUserByDigestUID(hash(token.UID))
if err != nil {
// エラー処理
}
next.ServeHTTP(w, r.WithContext(context.WithValue(ctx, userKey{}, user)))
})
}
}
func hash(token string) string {
bytes := sha256.Sum256([]byte(token))
return hex.EncodeToString(bytes[:])
}
프로세서를 사용하여 상기 중간부품Auth
에 지정된 사용자의 코드를 가져오면 다음과 같다.// 省略
func postTasks(w http.ResponseWriter, r *http.Requst) {
user := r.Context().Value(userKey{}).(*User)
// 省略
}
참고 자료
Reference
이 문제에 관하여(백엔드 Go 애플리케이션에서 Firebase Authentication 사용자 지정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/minguu42/articles/20220501-go-firebase-auth텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)