source

Firebase Auth ID 토큰에 잘못된 "aud" 클레임이 있습니다.

factcode 2023. 6. 13. 22:50
반응형

Firebase Auth ID 토큰에 잘못된 "aud" 클레임이 있습니다.

idToken 백엔드를 확인하려고 합니다.사용자가 Firebase 클라이언트 측에 성공적으로 로그인했지만 백엔드에서 idToken을 확인하려고 하면 이 유용하지 않은 오류 메시지가 표시됩니다.

Firebase Auth ID 토큰에 잘못된 "aud" 클레임이 있습니다.

오류 메시지는 더 많은 정보를 제공하는 것으로 보이며, 결국 인증 키에 프로젝트 이름이 없는 것으로 요약됩니다.

오류: Firebase ID 토큰에 잘못된 "aud"(청중) 클레임이 있습니다."stripmall-0000"을 예상했지만 "617699194096-0aafcvsml0gke61d6077kkark051f3e1.apps.googleusercontent.com "을 받았습니다.ID 토큰이 이 SDK 인증에 사용된 서비스 계정과 동일한 Firebase 프로젝트에서 생성되었는지 확인합니다.ID 토큰을 검색하는 방법에 대한 자세한 내용은 https://firebase.google.com/docs/auth/server/verify-id-tokens 을 참조하십시오.

뭐가 잘못됐는지 조금이라도 아는 사람?나는 고객으로부터 tokenId를 정확하게 받았기 때문에 문제가 되지 않습니다.이전에 질문을 받은 적이 있거나 다른 방식으로 사소한 경우 진심으로 사과드립니다.

  firebase.initializeApp({
        serviceAccount: {
            "type": "service_account",
            "project_id": <project id here>,
            "private_key_id": <key id goes here>,
            "private_key": <key goes here>
            "client_email": <email goes here>,
            "client_id": <my client id>,
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://accounts.google.com/o/oauth2/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": <url goes here>
        },
        databaseURL: <my db url here>
    });

    router.post("/verify", function (req, res) {
        firebase.auth().verifyIdToken(req.body.idToken).then(function (decodedToken) {
            var uid = decodedToken.sub;
            res.send(uid);
        }).catch(function (error, param2) {
            console.log(error);  // 'Firebase Auth ID token has incorrect "aud" claim'
        });

    });

문제는 다음 중 하나가 반환한 JWT 토큰을 사용하려고 하는 것일 수 있습니다.auth()과 같은 기능firebaseRef.auth().signInWithPopup()토큰을 하지만, 이 높으며, JWT에 의한 을 통과하지 것입니다.verifyIdToken파이어베이스 기술 지원팀에서 확인했습니다.

은 다을사야합니다해를 해야 합니다.firebaseRef.auth().currentUser.getToken()기능.은 검증을입니다.그 토큰은 검증을 통과할 것입니다.

TLDR: 다른 답변에서 언급했듯이, 앱을 올바르게 초기화하지 않았습니다.

비록 제가 이 문제에 대해 조금 늦었지만, 저도 같은 문제를 가지고 있었기 때문에, 저는 후드 뒤에서 무슨 일이 일어나고 있는지 알아보기로 결정했습니다.

이 한, 먼저, 가있이후 API변한,serviceAccount는 의일부존않습다니지의 AppOptions인터페이스, 아마도 이것이 오류가 발생한 이유일 것입니다.그래서 저는 당신이 가지고 있는 것이 미래에 있을 것이라고 가정할 것입니다.credential키.키.키.키.

둘째, 이 오류가 https://github.com/firebase/firebase-admin-node/blob/master/src/auth/token-verifier.ts (이 글을 쓸 당시 187행)에 던져진 것을 알 수 있습니다.aud은 토의클을와비다니합교큰과 됩니다.this.projectId.

하려는 토큰이 측이 지정 방법에 일 수 있습니다. 이 " 다답변서언듯이했급클측토확, 이것은생서에성것아된이큰려하는니다라사방경이인의라있생수지때에해법자용우성었기되문습니다일정른른이트이언에▁now▁method,▁that▁mention▁the▁this이▁be경▁not있수우,▁client,▁as-▁in▁other습니다때▁answers일문▁some생▁custom▁was▁token▁because▁are▁could,▁case▁the기다었되,의성▁other해aud클레임은 존재하지 않거나, 완전히 무작위적이거나, 확실히 당신과 같지 않은 것일 수 있습니다.projectId그래서 당신은 그것을 먼저 확인해야 합니다.

측에서 생성된 것이 은 " 나토큰클라언측생에성것서된이확다다같요니이약됩음과면그실하러트이이다▁however니요▁down됩▁was약▁to-▁if▁then로 요약됩니다.projectId설정되어 있지 않거나 최소한 예상한 방식으로 설정되어 있지 않습니다.만약 당신이 그것은getProjectId()https://github.com/firebase/firebase-admin-node/blob/master/src/utils/index.ts 의 방법 (이 글을 쓸 당시 66행), 당신은 그것을 봅니다.projectId세 가지 방법 중 하나로 결정됩니다.app.options에서 직접 projectIdapp.options.credential에서 OR »process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT이것은 만약에projectId가 GCloud에서 에서 경우stripmall-0000그러면 Google은 원래 프로젝트의 projectId가 아닌 Firebase-auth와 관련된 모든 항목에 대해 현재 환경의 projectId를 자동으로 사용합니다.

세 가지 옵션이 있습니다.

  1. projectId▁in에 직접 됩니다.AppOptions:

    firebase.initializeApp({
        databaseURL: <my db url here>,
        // Set your projectId directly here in options:
        projectId: <your-projectId-here>
    });
    
  2. 또는 자격 증명 개체를 올바르게 설정하여 이 방법을 수행하는 것이 좋습니다.

    firebase.initializeApp({
        credentials: admin.credential.cert(<<path-to-your-certificate> || <admin.ServiceAccount object>>),
        databaseURL: <my db url here>
    });
    
  3. 또는 환경 변수가 동일하도록 Firebase 앱과 동일한 프로젝트 내에서 앱을 호스팅하기만 하면 됩니다.(실제로 100%는 아니지만, 이것이 Firebase-functions, 즉 클라우드-functions가 작동하는 방식이라고 생각합니다.)

문제는 토큰이 아니라 서비스 계정을 사용하여 백엔드를 초기화해야 한다는 이었습니다.이렇게 하면 로컬 개발 서버에서 테스트하고 디버그할 수도 있습니다.

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

FirebaseOptions options = new FirebaseOptions.Builder()
            .setCredentials(GoogleCredentials.fromStream(serviceAccount))
            .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
            .build();

FirebaseApp.initializeApp(options);
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();

// Get the FB uid from the token
FirebaseToken decodedToken = firebaseAuth.verifyIdTokenAsync(token).get();
String uid = decodedToken.getUid();

출처: https://firebase.google.com/docs/admin/setup

Thach Lockevn이 코멘트에서 언급했듯이 저에게 효과적인 솔루션은 다음과 같습니다.

import { AngularFireAuth } from '@angular/fire/auth';
import { auth } from 'firebase/app';

this.angularFireAuth.signInWithPopup(new auth.GoogleAuthProvider()).then((googleAuth) => {
        this.user = googleAuth.user;
        googleAuth.user.getIdToken().then(tkn => {
            this.token = tkn;
            //send the token to the backend...
        });
    });

로컬에서 실행 중인 경우 잘못된 GOOGLE_APPLICATION_CREDIES 환경 변수가 있는 경우에도 이 오류 메시지가 표시됩니다.이 환경변수로 설정된 JSON 키가 프로젝트의 JSON 키와 일치하는지 확인합니다.

이런 답답한 오류를 만들어낼 수 있는 또 다른 사례가 있습니다.만약 당신이 포스트맨, 인섬니아, GraphQL Playground(이번에는 범인) 등과 같은 쿼리 도구를 열고 있다면, 그것들은 당신의 인증 키가 변경되었을 때에도 오래된 Authentication Bearer 토큰을 보유하고 당신의 API에 요청을 하고 있을 수 있습니다.

여기서 간단한 해결책은 해당 베어러 토큰으로 현재 인증된 모든 요청을 지우고 다시 인증하는 것입니다.

GraphQL Playground에서는 기본적인 특성상 각 쿼리 탭의 헤더에 인증 토큰을 복사/붙여넣어야 하므로 각 탭을 닫거나 수정하지 않더라도 API 콘솔을 스팸 처리하는 오류가 계속 발생합니다.

이에 대한 해독제로 인섬니아를 추천합니다. 적절한 쿼리 체인 방식을 사용하면 이를 완전히 피할 수 있습니다.추가 세부 정보: 인섬니아의 환경 변수 중 하나를 통해 사용자 인증 쿼리의 베어러 토큰 결과를 다른 쿼리로 자동 전달할 수 있습니다.

잘못된 사용자(잘못된 프로젝트 구글 충돌 프로젝트 FIX)

GKE 클러스터(A 계정을 사용하여 생성) 내에서 NetJS 서버를 사용하고 관리 SDK를 외부 Firebase 앱(B 계정을 사용하여 생성)에 연결하려고 했습니다.

GKE가 NextJS 앱에 영향을 주는 환경 변수를 사용하여 자격 증명을 설정하고 있습니다.

해결책

설정합니다.GOOGLE_APPLICATION_CREDENTIALSNextJS 앱을 위한 환경(사용할 수 있음).env파일.

결론

노드 변수는 기본 인증 앱(Crazy!)보다 우선합니다.

https://firebase.google.com/docs/admin/setup#initialize_the_sdk

인증 ID 토큰에는 두 가지 유형이 있습니다.

  1. 구글 기반
  2. Firebase 인증 제공토켄 아이디

Firebase 인증으로 구현할 경우 Firebase에서 제공하는 토큰이 필요합니다.

첫 번째 Google ID 토큰을 받게 되며, 이 토큰을 사용하면 Firebase 인증에 사용되는 자격 증명을 얻을 수 있습니다. 여기에 제공됩니다.

idToken : 구글 ID 토큰

AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null)

다음을 사용하여 소방서에 로그인했습니다.

firebase.signInWithCredential(credential).addOnCompleteListener(this, task -> { ....})

이 통화에서 당신은 파이어베이스 ID 토큰을 받게 될 것입니다.

ftoken : firebase ID 토큰

String ftoken = task.getResult().getUser().getIdToken(false).getResult().getToken()

언급URL : https://stackoverflow.com/questions/38335127/firebase-auth-id-token-has-incorrect-aud-claim

반응형