在React Native应用程序中处理身份验证:最佳方法?

时间:2019-12-08 14:37:36

标签: node.js react-native google-cloud-firestore jwt

我打算在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);

0 个答案:

没有答案