我打算在React Native中创建一个应用程序。我想向此应用添加用户身份验证。
我打算将Google Firebase Firestore用作我要存储用户数据的地方。是的,我知道Firebase提供了身份验证,但是我不想使用它,因为我想对用户数据具有更大的灵活性。
我创建了一个包含两个文档的“用户”集合,两个文档都有两个字段:“用户名”和“密码”。我尚未填写注册表单,因此我将通过Firebase控制台直接在数据库中设置用户。
我想使用JSON Web令牌来认证用户。首先,这是一个好方法吗?
用户登录后,将其输入的用户名和密码发送到与Firestore数据库进行通信的Node.js服务器。它执行“ where”查询(代码如下所示),并且如果快照不为空(因此找到具有正确凭据的文档),则将提取文档ID,并创建一个JWT。该JWT通过Node.js服务器发送回React Native应用,并通过asyncStorage存储在该应用中。到目前为止,一切都很好,并且我已经开始执行此部分。
现在,我在客户端拥有JWT,我想在用户每次执行操作时对其进行验证。我的第一个问题是:我可以在客户端验证此令牌,还是应该将令牌发送到Node.js服务器并在那里进行验证?我的第二个问题:处理此问题的最佳工作流程是什么?我正在考虑验证令牌服务器端,并发送响应true或false。如果为false,则会从客户端删除令牌,然后注销客户端。
你们怎么看?我要去某个地方还是应该采取其他方法?
某些代码:
const express =require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
const jwt = require('jsonwebtoken');
const jwtKey = 'my-secret-key';
const jwtExpirySeconds = 300;
const admin = require('firebase-admin');
const serviceAccount = require('./service-account-file.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'database-url'
});
const db = admin.firestore();
app.post('/signin', function(req, res) {
const { username, password } = req.body;
let usersRef = db.collection('users');
let queryRef = usersRef.where('username', '==', username).where('password', '==', password);
queryRef.limit(1).get().then(
snapshot => {
if(snapshot.empty) {
res.status(400).send('No user found');
}
snapshot.forEach(document => {
// document.id contains the user ID
let userId = document.id;
const token = jwt.sign({ userId }, jwtKey, {
algorithm: 'HS256',
expiresIn: jwtExpirySeconds
});
console.log(token);
});
}).catch(err => console.log(err));
});
app.listen(8080);