我正在尝试将Auth0 JWT令牌与Firebase一起使用,但运气不佳。
将令牌与Firebase一起使用时:
const token = localStorage.getItem('id_token'); //from auth0
firebase.auth().signInWithCustomToken(token).catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
console.log(error);
console.log(token);
});
我得到的只是:
“The custom token format is incorrect. Please check the documentation.”
据我在Firebase的文档中看到的,Auth0和Firebase令牌不同: https://firebase.google.com/docs/auth/admin/create-custom-tokens
显然, Firebase需要一个uid ,它不会出现在由 Auth0生成的uid 中。。
我尝试创建一个规则来修改Auth0的令牌,以包含一个名为uid的子副本,看看这是否是一个解决方案,但它不起作用,没有任何内容添加到令牌的主体。
function (user, context, callback) {
context.idToken.uid = user.user_id;
callback(null, user, context);
}
有任何想法/建议吗?
PS:
1.我检查了jwt.io中的令牌及其有效。 我尝试将到期时间减少到不到5分钟,因为我看到有些人认为这是一个可能的解决方案,但事实并非如此。
答案 0 :(得分:3)
您无法直接在Firebase中使用Auth0令牌。您需要创建一个服务器端API,使用firebase-admin
SDK使用Auth0数据创建Firebase自定义令牌。
OAuth网站上有full tutorial个结束。在给定OAuth令牌的情况下,查看 API路径部分,了解如何使用firebaseAdmin.auth().createCustomToken
:
// Auth0 athentication middleware
const jwtCheck = jwt({
secret: jwks.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: `https://${config.AUTH0_DOMAIN}/.well-known/jwks.json`
}),
audience: config.AUTH0_API_AUDIENCE,
issuer: `https://${config.AUTH0_DOMAIN}/`,
algorithm: 'RS256'
});
// Initialize Firebase Admin with service account
const serviceAccount = require(config.FIREBASE_KEY);
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert(serviceAccount),
databaseURL: config.FIREBASE_DB
});
// GET object containing Firebase custom token
app.get('/auth/firebase', jwtCheck, (req, res) => {
// Create UID from authenticated Auth0 user
const uid = req.user.sub;
// Mint token using Firebase Admin SDK
firebaseAdmin.auth().createCustomToken(uid)
.then(customToken =>
// Response must be an object or Firebase errors
res.json({firebaseToken: customToken})
)
.catch(err =>
res.status(500).send({
message: 'Something went wrong acquiring a Firebase token.',
error: err
})
);
});