我正在处理的网站使用Firebase身份验证,登录的不同用户对于可以访问的页面具有不同的权限。
登录的方式与此post类似:
我遇到的问题是,当他们访问新页面时,我试图将令牌从客户端传递回服务器(几乎与它在此{{3}中的完成方式相同) }),验证令牌&检查是否有权查看网页。
我试图找出最好(也是最安全)的方法来做到这一点。我考虑过以下选项:
我一直在尝试在请求标头中传递令牌,但据我了解,当用户点击指向其他网页的链接时(或者如果在javascript中重定向),您无法添加标头。同样的问题适用于使用POST。
如果用户点击指向其他网页的链接,我该如何安全地将此信息传递到服务器并检查权限?
答案 0 :(得分:7)
You can get the accessToken (idToken) on client side by:
var accessToken = null;
firebase.auth().currentUser
.getIdToken()
.then(function (token) {
accessToken = token;
});
and pass it in your request headers:
request.headers['Authorization'] = 'Bearer ' + accessToken;
and on your server side get the token with your prefered method and authenticate the request with Firebase Admin SDK, like (Node.js):
firebaseAdmin.auth()
.verifyIdToken(accessToken)
.then(decodedIdToken => {
return firebaseAdmin.auth().getUser(decodedIdToken.uid);
})
.then(user => {
// Do whatever you want with the user.
});
答案 1 :(得分:0)
如今,看来我们打算使用httpsCallable()
客户端来获得预先授权的对象,以与您的端点进行对话。
例如:
// # ./functions/index.js
exports.yourFunc = functions.https.onCall((data, context) => {
// Checking that the user is authenticated.
if (!context.auth) {
// Throwing an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
'while authenticated.');
}
// ... rest of your method
});
// ./src/models/addMessage.js
const firebase = require("firebase");
require("firebase/functions");
firebase.initializeApp({
apiKey: '### FIREBASE API KEY ###',
authDomain: '### FIREBASE AUTH DOMAIN ###',
projectId: '### CLOUD FUNCTIONS PROJECT ID ###'
databaseURL: 'https://### YOUR DATABASE NAME ###.firebaseio.com',
});
var functions = firebase.functions();
// This is the new code:
var yourFunc = firebase.functions().httpsCallable('yourFunc');
yourFunc({foo: bar}).then(function(result) {
// ...
});