客户端引入uni-id系统
去插件市场下载uni-id-pages。这是uni-cloud里面的,需要订阅uni-cloud。
下载完成之后会生成一些关于用户模块的页面。这些页面的路径可以在
pages.json里面找到。http://localhost:5174/#/uni_modules/uni-id-pages/pages/register/register。找到注册页面就可以注册。
我们可以在
admin的管理后台看到新注册的用户
注意看
可登录应用这一列。虽然在同一张表里,但是由于属于不同的可登录应用。所以新注册的admin666只能登录客户端,不能登录后台管理系统。也可以通过后台管理系统设置:
首先找到
mainfest.json文件,找到APP ID
在admin后台,找到应用管理,添加即可
在用户管理里面添加权限

配置uni-id的路由,设置到特定的页面必须要要登录才可以
只需要在
pages.json里面配置// uni-id的路由设置 // https://doc.dcloud.net.cn/uniCloud/uni-id/summary.html#uni-id-router "uniIdRouter": { "loginPage": "uni_modules/uni-id-pages/pages/login/login-withpwd", // 登录页面路径 "needLogin": [ // 需要登录才可访问的页面列表,可以使用正则语法 "pages/shop/order" ] }注意,在测试的时候需要清空本地缓存——也就是退出登录
在
../uni_modules/uni-id-pages/common/store.js里面封装了许多登录、登出、注册等方法,可以操作用户
配置微信登录
首先需要在微信小程序的管理平台上生成
AppSecret
接着去
uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json里面去配置"mp-weixin": { "tokenExpiresIn": 259200, "tokenExpiresThreshold": 86400, "oauth": { "weixin": { "appid": "..........", "appsecret": ".............." } } }接着登录的代码
// 获取 uni-id-co 的云对象 const uniIdCo = uniCloud.importObject('uni-id-co',{customUI:true}) // 获取code码:用户登录凭证。开发者需要在开发者服务器后台,使用 code 换取 openid 和 session_key 等信息 let {code} = await uni.login() // 使用微信登录 let {errCode,...rest} = await uniIdCo.loginByWeixin({code});
$cloudEnv_uid 和 "$env": "uid"
$cloudEnv_uid 和 "$env": "uid" 本质完全相同,都是通过解析请求中的 Token 来获取当前登录用户的 ID。
// 它们指向同一个东西,只是使用场景不同:
// 1. 在 JQL 查询中使用
where(`user_id == $cloudEnv_uid`) // ← 从 Token 解析
// 2. 在数据库 Schema 中使用: 默认值是当前登录用户的 ID
{
"defaultValue": {
"$env": "uid" // ← 从 Token 解析
}
}
//--------------------------------------------------------------------------
//Schema 中的 "$env": "uid"
// 前端插入
await dbJQL.collection('orders').add({
product: "手机"
// 没有传 user_id
});
// 服务端处理流程:
// 1. 从请求头获取 Token
// 2. 解析 Token 得到 uid = "6478abc123..."
// 3. 发现 Schema 中 user_id 的 defaultValue 是 { "$env": "uid" }
// 4. 自动填充 user_id = "6478abc123..."
// 5. 执行插入
//--------------------------------------------------------------------------
//JQL 查询中的 $cloudEnv_uid
// 前端查询
await dbJQL.collection('orders')
.where(`user_id == $cloudEnv_uid`)
.get();
// 服务端处理流程:
// 1. 从请求头获取 Token
// 2. 解析 Token 得到 uid = "6478abc123..."
// 3. 将 $cloudEnv_uid 替换为 "6478abc123..."
// 4. 执行实际查询:WHERE user_id = "6478abc123..."
$cloudEnv_uid 和 "$env": "uid" 完全依赖 uni-id 用户系统,因为用户ID的来源是 uni-id。
┌─────────────────────────────────────────────────────┐
│ uni-id │
│ (uniCloud 官方用户认证系统) │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ 1. 用户登录生成 Token │ │
│ │ - JWT Token 中包含 uid │ │
│ │ - uid 就是 uni-id-users 表的 _id │ │
│ └────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ 2. Token 存储和传递 │ │
│ │ - 前端自动存储 uni_id_token │ │
│ │ - 请求自动携带 Authorization 头 │ │
│ └────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ 3. uniCloud 服务端解析 │ │
│ │ - 验证 Token 签名 │ │
│ │ - 提取 uid (来自 uni-id-users._id) │ │
│ │ - 注入到 $cloudEnv_uid 和 $env:uid │ │
│ └────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘