【发布时间】:2018-10-02 01:19:35
【问题描述】:
我在登录时在后端服务器上创建了一个自定义令牌,下面是代码:
UserSchema.methods.generateAuthToken = function() {
var user = this;
var access = "auth";
return firebaseAdmin.default
.auth()
.createCustomToken(user._id.toHexString())
.then(function(token) {
user.tokens = user.tokens.concat([{ access, token }]);
return user.save().then(() => {
return token;
});
});
};
并将此令牌存储在 mongodb 中,并通过名为“x-auth”的标头将其发送回客户端,然后将其存储在 cookie 中。
在客户端,使用此令牌登录如下:
axios({
url: "/api/users/login",
method: "POST",
data: {
email: data.email,
password: data.password
}
}).then(res => {
Cookies.set("x-auth", res.headers["x-auth"], { expires: 7 });
return firebase
.auth()
.signInWithCustomToken(res.headers["x-auth"])
.then(response => {
console.log("CA", response);
response
.getIdToken()
.then(idToken => {
Cookies.set("idToken", idToken, { expires: 7 });
})
.catch(e => {});
dispatch(
login({
token: Cookies.get("x-auth")
})
);
});
});
现在为了调用 api 来获取所有用户,我将这些令牌、自定义令牌和 idToken 发送回服务器:
const authenticate = (req, res, next) => {
const token = req.header("x-auth");
const idToken = req.header("idToken");
User.findByToken(token, idToken)
.then(user => {
if (!user) {
return Promise.reject({
message: "no user found with the associated token!"
});
}
req.user = user;
req.token = token;
next();
})
.catch(e => {
res.status(401).send(setErrorMessage(e.message));
});
};
findByToken 如下:
UserSchema.statics.findByToken = function(token, idToken) {
var User = this;
return firebaseAdmin.default
.auth()
.verifyIdToken(idToken)
.then(function(decodedToken) {
var uid = decodedToken.uid;
return User.findOne({
_id: uid,
"tokens.access": "auth",
"tokens.token": token
});
})
.catch(function(e) {
return Promise.reject(e);
});
};
为什么我必须发送这两个令牌进行授权,这里的概念有什么问题。
https://firebase.google.com/docs/auth/admin/verify-id-tokens
警告:Firebase Admin SDK 中包含的 ID 令牌验证方法旨在验证来自客户端 SDK 的 ID 令牌,而不是您使用 Admin SDK 创建的自定义令牌。有关详细信息,请参阅身份验证令牌。
请澄清我是否可以验证自定义令牌而不是 idToken 来检索 userId 并将其与 DB 匹配,而不是出于一个目的使用不同的令牌,或者我在这里做错了,自定义令牌不应该存储在 DB 中,还有其他一些方法。
现在,当我尝试获取所有用户时,它说:
Firebase ID 令牌已过期。从您的客户端应用程序获取新令牌并重试(auth/id-token-expired)。有关如何检索 ID 令牌的详细信息,请参阅 https://firebase.google.com/docs/auth/admin/verify-id-tokens。
【问题讨论】:
标签: javascript firebase firebase-authentication access-token firebase-admin