Firebase Auth ID令牌具有不正确的“aud”声明

kuhbmx9i  于 10个月前  发布在  其他
关注(0)|答案(9)|浏览(182)

我试图验证一个idToken后端.用户已成功登录到firebase客户端,但当我试图验证我的后端idToken我得到这个不是很有帮助的错误消息
Firebase Auth ID令牌具有不正确的“aud”声明
错误消息似乎变得更有信息性,并归结为auth键中没有项目名称:
错误:Firebase ID令牌具有不正确的“aud”(audience)声明。应为“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'
        });

    });

字符串

pbwdgjma

pbwdgjma1#

您的问题可能是您试图使用auth()函数(如firebaseRef.auth().signInWithPopup())返回的JWT令牌。这些函数确实返回了JWT令牌,但auth声明可能是错误的,不会通过verifyIdToken的验证。Firebase技术支持证实了这一点。
您必须使用firebaseRef.auth().currentUser.getToken()函数。该令牌将通过验证。

nbysray5

nbysray52#

TLDR:正如在另一个答案中提到的,您没有正确初始化应用程序。
虽然,我有点晚了,我有同样的问题,所以我决定潜入,看看引擎盖后面发生了什么。
首先,除非API在这个问题提出后发生了变化,否则serviceAccount并不作为AppOptions接口的一部分作为属性存在,这可能就是你得到错误的原因。
其次,您会看到这个错误是在https://github.com/firebase/firebase-admin-node/blob/master/src/auth/token-verifier.ts(撰写本文时的第187行)抛出的,其中令牌中的aud声明与this.projectId进行了比较。
现在,正如其他答案所提到的,这可能是因为您试图验证的令牌不是在客户端创建的,而是通过其他自定义方法创建的,在这种情况下,aud声明可能不存在,完全随机,或者肯定不等于您的projectId,所以您应该首先检查。
但是,如果您确定令牌是在客户端创建的,那么它可以归结为没有设置projectId,或者至少没有以您期望的方式设置。(撰写本文时的第66行),您可以看到projectId是通过以下三种方式之一确定的:直接从app.options对象,从app.options.credential中的projectId属性,或从process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT。这意味着如果没有设置projectId,如果您的项目托管在GCloud上,(我假设stripmall-0000是),那么Google将自动使用您当前环境的projectId来处理与firebase-auth相关的任何内容,而不是原始项目的projectId。
所以有三个选择
1.使用直接在AppOptions中设置的projectId初始化您的应用:

firebase.initializeApp({
    databaseURL: <my db url here>,
    // Set your projectId directly here in options:
    projectId: <your-projectId-here>
});

字符串
1.或者通过正确设置credentials对象来实现这一点可能更好:

firebase.initializeApp({
    credentials: admin.credential.cert(<<path-to-your-certificate> || <admin.ServiceAccount object>>),
    databaseURL: <my db url here>
});


1.或者,只需将应用程序托管在与您的firebase应用程序相同的项目中(现在它们是同一生态系统的一部分),以便环境变量相同。(实际上不是100%关于这一点,但我假设这就是firebase函数,即cloud函数的工作方式)

fzsnzjdm

fzsnzjdm3#

正如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...
        });
    });

字符串

kokeuurv

kokeuurv4#

对我来说,问题不是**令牌,而是我需要使用服务帐户初始化我的后端。这样做你也可以从本地开发服务器测试和调试。

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

jjhzyzn0

jjhzyzn05#

auth ID Token有两种类型

1.谷歌旗下

  1. Firebase提供AuthIDToken
    你需要Firebase提供的令牌,如果你实现它与Firebase身份验证。
    您将获得第一个Google ID令牌,并使用该令牌获得用于对firebase进行身份验证的凭据,此处提供
    idToken:google id token
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null)

字符串
您正在使用以下命令登录Firebase

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


在此回调中,您将获得Firebase ID令牌
ftoken:firebase id token

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

hgncfbus

hgncfbus6#

如果您在本地运行,如果您的GOOGLE_APPLICATION_CREDENTIALS环境变量不正确,也会弹出此错误消息。请检查使用此环境变量设置的JSON键是否与project的JSON键匹配。

z2acfund

z2acfund7#

还有另一种情况可能会产生这种令人沮丧的错误。如果您有一个查询工具,如Postman,Inclusion,GraphQL Playground(这次的罪魁祸首)等打开,那么这些工具可能持有旧的身份验证承载令牌并向您的API发出请求,即使您的身份验证密钥已经更改。
这里的简单解决方案是清除当前使用这些Bearer令牌进行身份验证的所有请求并重新进行身份验证。
这在GraphQL Playground中尤其令人讨厌,因为它的基本性质迫使您将auth token复制/粘贴到每个查询选项卡的标题中,因此如果您不关闭或修改每个选项卡,您仍然会收到此错误垃圾邮件发送到您的API控制台。
我建议使用Incredible作为解毒剂,因为使用适当的查询链接实践,您可以完全避免这种情况。进一步的细节:您可以通过Incredible的环境变量之一自动将用户身份验证查询的承载令牌结果传递给任何其他查询。

pinkon5k

pinkon5k8#

错误的受众(错误的项目GOOGLE项目间冲突修复)

我正在使用GKE集群内的NetJS服务器(使用帐户A创建),并试图将admin SDK连接到外部Firebase应用程序(使用帐户B创建)。
GKE使用影响NextJS应用程序的环境变量设置凭据

解决方案

我为NextJS应用程序设置了GOOGLE_APPLICATION_CREDENTIALS环境(您可以使用.env文件。

总结

Node变量的优先级高于默认的auth应用程序(疯狂!)
https://firebase.google.com/docs/admin/setup#initialize_the_sdk

wribegjk

wribegjk9#

我在一个Flutter项目中遇到了这个错误。对我来说,这个问题是在firebase控制台中添加了一个丢失的SHA指纹。
如果是这种情况,你可以自己签署你的应用程序,并复制粘贴在firebase控制台的关键。
步骤1生成密钥:

keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

字符串
(官方指南:https://developers.google.com/android/guides/client-auth?hl=en
第二步上传:
上一步应该已经提示你一个键,只需转到控制台导航到:
项目设置>常规>您的应用
选择您的应用程序,然后点击“添加指纹密钥”并将密钥粘贴在那里


的数据

相关问题