Firebase 客户端错误:自定义令牌对应于不同的受众群体



我正在使用Firebase Python AdminSDK生成一个自定义令牌,Javascript客户端使用该令牌登录Firebase。 当 JS 客户端尝试使用自定义令牌进行身份验证时,它会收到错误"自定义令牌对应于不同的受众"。

给出的错误代码:"auth/custom-token-mismatch"。

许多谷歌关于"受众"不匹配的答案参考分析。 但我正在做一个 Web 项目,而不是 iOS 或 Android,所以我不能使用 Analytics 来管理受众。

我读过的SO答案列在下面的末尾。

我捕获了自定义令牌并将其插入 https://jwt.io/,值和实例化/过期时间(相隔一小时(看起来都不错:

在 jwt.io 上解码自定义令牌:

{
"claims": {},
"uid": "<myuniqueID",
"sub": "firebase-adminsdk-1knpr@firebase-<myproject>.iam.gserviceaccount.com",
"iss": "firebase-adminsdk-1knpr@firebase-<myproject>.iam.gserviceaccount.com",
"iat": 1540153710,
"aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"exp": 1540157310
}

蟒蛇服务器:

def getFirebaseInstance():  # For Firebase Python SDK
try:
currentDir_path = os.path.dirname(os.path.realpath(__file__))
cred = credentials.Certificate(currentDir_path + '/includeFirebaseServiceAccounts/firebase-<myprojectname>-firebase-adminsdk-1knpr-e1244dd261.json')  
firebaseAdmin = firebase_admin.initialize_app(cred, { 'databaseURL': 'https://<myprojectname>.firebaseio.com', 'databaseAuthVariableOverride': {'uid':'<myuniqueServerID>'}})
if firebaseAdmin:
return(firebaseAdmin)
except:
raise

def firebaseClientToken(request):
try:
uid = "<myuniqueClientID>"  # case sensitive
additional_claims = { }
token = auth.create_custom_token(uid,additional_claims)
return HttpResponse(token)
except Exception as err:
return HttpResponse("System error:" + str(err), status=406)

Javascript 客户端:

(
function authClient2Firebase() {
$.ajax({
url: "firebaseClientToken/",
method: "POST",
success: function(response) { step2(response); },
error: function(xhr) { alert("There was an error loading a security check.  Have you lost your internet connection?  Detail:" + xhr.responseText); }
});
function step2(customToken) {
try {
firebase.auth().signInWithCustomToken(customToken).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert("There was an error with the secure login. nnDetail: " + errorMessage + 'nCode: ' + errorCode);
});
}
catch(err) {
alert(err);
}
console.log("authClient2Firebase.js: Firebase login succeeded!");
}
}
)();

我在控制台"设置"页面下的项目确实有一个 Web API 密钥,但我没有看到它在任何地方使用过。

控制台的"设置"->"用户和权限"页面下只有一个用户,即我。

控制台"设置"->"服务帐户"页面上仅列出一个服务帐户。 我尝试删除该页面上的所有机密,生成一个新机密,然后生成并安装一个新的蓝色按钮"机密"(名称不好,实际上它会生成整个 json 凭据对象(。

这些是控制台"身份验证"->"登录方法"中列出的域:

localhost                      Default
<myproject>.firebaseapp.com    Default
127.0.0.1                      Custom
auth.firebase.com              Custom

我使用的实际域是localhost:8000,无法在此处输入。

SO回答咨询不成功:

自定义令牌对应于不同的受众 (我没有使用密钥,除了存储在服务帐户中的内容 凭据。

Firebase 令牌错误,"自定义令牌对应于不同的受众群体。

Firebase 自定义身份验证颁发令牌不同受众输入 链接描述在这里(关闭,但我没有使用节点服务器和 不确定他所说的服务器"必须属于同一项目"是什么意思 因为 Python 服务器没有以任何方式注册,除非通过 我下载的服务帐户凭据。

令人尴尬但确实如此,事实证明这是一个简单的疏忽。 当 JS 客户端将自身初始化为 Firebase 应用时,在进行身份验证之前,它使用的是测试环境中的旧凭据。

// Initialize Firebase
var config = {
apiKey: "<WebAPI from Firebase console, 'Project Settings'>",
authDomain: "<myproject>.firebaseapp.com",
databaseURL: "https://<myproject>.firebaseio.com",
projectId: "<myproject>",
storageBucket: "<myproject>.appspot.com",
messagingSenderId: "<id from Console Project Settings>"  // optional
};
firebase.initializeApp(config);

相关内容

最新更新