uni-app操作uni-id-device表,记录device_id与user_id映射关系时校验token的含义是什么?

发布于 1周前 作者 caililin 来自 Uni-App

uni-app操作uni-id-device表,记录device_id与user_id映射关系时校验token的含义是什么?

在做unipush,文档里有一句话有些不解—“如果你不使用uni-id-pages需要在App.vue调用uniCloud.onRefreshToken 监听token发生变化(即:用户登录和token续期时),调用服务端云对象的某个方法(参数:push_clientid)操作uni-id-device表,记录device_id 与 user_id(防客户端伪造,需校验token)的映射关系”

这里的校验token是指什么?是指操作uni-id-device表时在自己写的云对象里校验么?具体该怎么校验啊?大神指点一下吧。

另外,为避免用户退出后登录其他账号,用户每次退出登录时,是不是也要删除uni-id-device表中已存在的push_clientid记录?

Image


1 回复

在uni-app中操作uni-id-device表来记录device_iduser_id的映射关系时,校验token的主要目的是确保请求的安全性和验证用户身份的合法性。token通常是一种经过加密或签名的字符串,它包含用户的身份信息以及过期时间等信息,用于在客户端和服务器之间进行身份验证。

以下是一个简化的示例,展示了如何在uni-app中进行token校验并记录device_iduser_id的映射关系。假设我们使用一个假设的API接口/api/register-device来处理这一逻辑。

1. 客户端发送请求

客户端(uni-app)在发送请求时,需要将token包含在请求头中。

uni.request({
    url: 'https://yourserver.com/api/register-device',
    method: 'POST',
    header: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + userToken // userToken是之前获取的token
    },
    data: {
        device_id: uni.getStorageSync('device_id') || uni.getSystemInfoSync().model, // 示例device_id,实际应根据设备唯一标识生成
        user_id: userId // 从登录状态或其他途径获取的用户ID
    },
    success: (res) => {
        console.log('Device registered successfully:', res.data);
    },
    fail: (err) => {
        console.error('Failed to register device:', err);
    }
});

2. 服务器端校验token并记录映射关系

服务器端接收到请求后,首先校验token的有效性。这里以Node.js和Express为例,展示一个简单的token校验逻辑。

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const SECRET_KEY = 'your_secret_key'; // 用于签名和验证token的密钥

app.use(express.json());

app.post('/api/register-device', (req, res) => {
    const token = req.headers['authorization'].split(' ')[1];
    
    jwt.verify(token, SECRET_KEY, (err, decoded) => {
        if (err) {
            return res.status(401).json({ error: 'Invalid token' });
        }
        
        const { device_id, user_id } = req.body;
        
        // 假设你有一个函数saveToDeviceTable来将device_id和user_id保存到数据库
        saveToDeviceTable(device_id, user_id)
            .then(() => res.json({ message: 'Device registered successfully' }))
            .catch((error) => res.status(500).json({ error: error.message }));
    });
});

// 假设的保存函数(实际应根据你的数据库实现)
function saveToDeviceTable(device_id, user_id) {
    // 数据库保存逻辑...
    return Promise.resolve(); // 示例返回成功
}

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个示例中,服务器通过jwt.verify函数校验token的有效性,如果token有效,则继续处理请求,将device_iduser_id保存到uni-id-device表中。如果token无效,则返回401状态码表示未授权。

回到顶部