Har*_*rry 18 authentication node.js firebase-admin
目前我正在nodejs上创建Firebase API.我想在nodejs上使用firebase-admin处理所有Firebase内容(例如身份验证).但是,如果没有客户端的Javascript Firebase SDK,在firebase-admin中通过nodejs对用户进行身份验证的正确方法是什么?在admin的官方文档中,我没有找到一个名为signInWithEmailAndPassword的函数(就像在客户端SDK上一样)用于nodejs.只有一个名为" getUserByEmail "的函数,但此函数不会检查用户是否输入了正确的密码.
这是我的表格:
<form class="sign-box" action="/login" method="post">
<div class="form-group">
<input id="username" name="username" type="text" class="form-control" placeholder="E-Mail"/>
</div>
<div class="form-group">
<input id="password" name="password" type="password" class="form-control" placeholder="Password"/>
</div>
<button type="submit" class="btn btn-rounded">Sign in</button>
</form>
Run Code Online (Sandbox Code Playgroud)
提交表单后,我将值传递给nodejs中的API:
app.post('/login', urlencodedParser, function (req, res) {
// getting the values
response = {
username: req.body.username,
password: req.body.password
};
// authenticate the user here, but how ?
});
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是在客户端使用Firebase SDK使用signInWithEmailAndPassword登录并获取uid.一旦我有了UID,我想将UID发送到nodejs并调用函数createCustomToken并将生成的令牌(带有一些额外的声明)返回给客户端.一旦我得到令牌,我将使用函数signWithCustomToken(在客户端)来验证用户.这种方式是正确的还是有更好的方法?
Pab*_*ios 11
实际上,对于身份验证,您将需要使用firebase常规api,而不是admin.
首先,这将为您提供刷新的firebase令牌,而不是自定义令牌.如果您愿意,也可以这样做以获得自定义令牌,如果您需要自定义令牌,我也有一个示例.
npm install firebase --save
const firebase = require("firebase");
const config = {
apiKey: "",
authDomain: "",
databaseURL: "",
projectId: "",
storageBucket: "",
messagingSenderId: ""
};
firebase.initializeApp(config);
Run Code Online (Sandbox Code Playgroud)
我发布了我的登录firebase功能,但您可以将其更改为轻松表达.
exports.login = functions.https.onRequest((req, rsp)=>{
const email = req.body.email;
const password = req.body.password;
const key = req.body.key;
const _key = '_my_key_';
let token = '';
if(key === _key){
firebase.auth().signInWithEmailAndPassword(email,password).then((user)=>{
//The promise sends me a user object, now I get the token, and refresh it by sending true (obviously another promise)
user.getIdToken(true).then((token)=>{
rsp.writeHead(200, {"Content-Type": "application/json"});
rsp.end(JSON.stringify({token:token}));
}).catch((err)=>{
rsp.writeHead(500, {"Content-Type": "application/json"});
rsp.end(JSON.stringify({error:err}));
});
}).catch((err)=>{
rsp.writeHead(500, {"Content-Type": "application/json"});
rsp.end(JSON.stringify({error:err}));
});
} else {
rsp.writeHead(500, {"Content-Type": "application/json"});
rsp.end(JSON.stringify('error - no key'));
}
});
Run Code Online (Sandbox Code Playgroud)
注意:我使用此登录功能用Postman测试我的其他功能,所以这就是我发送密钥的原因,所以我可以私下使用它.
现在结合ADMIN和FIREBASE节点apy,我可以在我的firebase上使用HTTP函数做很多非常有趣的事情.
希望它能以某种方式帮助.
如果您的 Firebase 客户端应用与自定义后端服务器通信,您可能需要识别该服务器上当前登录的用户。为了安全地执行此操作,成功登录后,请使用 HTTPS 将用户的 ID 令牌发送到您的服务器。然后,在服务器上验证 ID 令牌的完整性和真实性并从中检索 uid。您可以使用以这种方式传输的 uid 来安全地识别服务器上当前登录的用户。
工作流程是:
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Run Code Online (Sandbox Code Playgroud)
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7766 次 |
| 最近记录: |