作者:阿钱 | 来源:互联网 | 2023-02-07 17:12
我正在使用的网站使用Firebase身份验证,登录的不同用户对他们可以访问的页面拥有不同的权限.
登录的方式是设置类似于这篇文章:
用户使用两个参数登录 - "id"和"email"
服务器使用这些来创建自定义"uid",然后使用Firebase Admin SDK创建发送回客户端的自定义令牌.
客户端使用Javascript Firebase SDK登录 - firebase.auth().signInWithCustomToken()
现在用户已登录,他们可以点击不同的页面 - 即'/ foo','/ bar'
我遇到的问题是,当他们访问新页面时,我正在尝试将令牌从客户端传递回服务器(几乎与在此Firebase文档中完成的方式相同),验证令牌并检查是否存在有权查看网页.
我正在努力找出最好(也是最安全)的方法.我考虑过以下选项:
用令牌构造一个URL,但我听说这不是一个好习惯,因为令牌暴露,会话劫持变得容易多了.
我一直在尝试在请求标头中传递令牌,但据我所知,当用户点击指向其他页面的链接时(或者如果它在Javascript中重定向),您无法添加标头.同样的问题适用于使用POST.
如果用户点击指向其他页面的链接,我该如何安全地将此信息传递到服务器并检查权限?
1> 小智..:
您可以通过以下方式获取客户端上的accessToken(idToken):
var accessToken = null;
firebase.auth().currentUser
.getIdToken()
.then(function (token) {
accessToken = token;
});
并将其传递到您的请求标头中:
request.headers['Authorization'] = 'Bearer ' + accessToken;
并在您的服务器端获取带有您首选方法的令牌,并使用Firebase Admin SDK验证请求,如(Node.js):
firebaseAdmin.auth()
.verifyIdToken(accessToken)
.then(decodedIdToken => {
return firebaseAdmin.auth().getUser(decodedIdToken.uid);
})
.then(user => {
// Do whatever you want with the user.
});