uni-app:使用HBuilderX引入uni-id系统并初步使用

  1. 客户端引入uni-id系统
  2. 配置微信登录
  3. $cloudEnv_uid 和 "$env": "uid"

客户端引入uni-id系统

  1. 去插件市场下载uni-id-pages。这是uni-cloud里面的,需要订阅uni-cloud。

  2. 下载完成之后会生成一些关于用户模块的页面。这些页面的路径可以在pages.json里面找到。

  3. http://localhost:5174/#/uni_modules/uni-id-pages/pages/register/register。找到注册页面就可以注册。

  4. 我们可以在admin的管理后台看到新注册的用户

  5. 注意看可登录应用这一列。虽然在同一张表里,但是由于属于不同的可登录应用。所以新注册的admin666只能登录客户端,不能登录后台管理系统。

  6. 也可以通过后台管理系统设置:

    • 首先找到mainfest.json文件,找到APP ID

    • 在admin后台,找到应用管理,添加即可

    • 在用户管理里面添加权限

  7. 配置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"
        ]
      }
      
    • 注意,在测试的时候需要清空本地缓存——也就是退出登录

  8. ../uni_modules/uni-id-pages/common/store.js里面封装了许多登录、登出、注册等方法,可以操作用户

配置微信登录

  1. 首先需要在微信小程序的管理平台上生成AppSecret

  2. 接着去uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json里面去配置

    "mp-weixin": {
      "tokenExpiresIn": 259200,
      "tokenExpiresThreshold": 86400,
      "oauth": {
    
        "weixin": {
          "appid": "..........",
          "appsecret": ".............."
        }
      }
    }
    
  3. 接着登录的代码

    // 获取 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     │    │
│  └────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────┘

×

喜欢就点赞,疼爱就打赏