openid之我见

本文介绍了XRI(可扩展资源标识符)的使用方法及其如何简化OpenID地址的识别过程。通过特定字符如等号(=), XRI地址可以被自动解析,并且文章详细解释了如何使网站支持OpenID身份验证,包括解析OpenID服务器地址、用户跳转流程及信息处理步骤。

xr通过字符(=、@、+、!等)自动让xri.net解析!
例如:http://xri.net/=drummond            http://2idi.com/contact/=drummond 不需要用xri://开头
通过=号,会知道这是个xri地址。等号后面的字符串就是个xri地址
http://dancewithnet.com/2007/03/29/openid-and-email/


<link rel="openid.server" href="http://mysecond.name/openidserver.aspx">
上面的是openid服务器
下面是委托
<link rel="openid.delegate" href="http://dancewithnet.mysecond.name/">
这样只要是加了这两条语句的网页地址就成了一个可以作为OPENID使用。
这样子好像是这个唯一类有个委托,而opneid服务器实例化了这个委托。其他的openid网站组织订阅了这个委托
当需要运用这个委托时,就由OPENID服务器来具体实现。
        一, 所以要想让自己的网站支持OPENID就是要做如下几件事情:1,从输入的OPENID解析出OPENID服务器地址
 (a,<link>标记中b,用户输入的OPENID标记中),2,跳转用户到指定的OPENID服务器。3,解析从OPENID服务器
传回来的信息。4,用户提交更具体的信息!5.赋权。
         二,可以让愿意使用自己网站地址作为OPENID的人访问OPENID组织内的网站,只要在自己网页中加上上面两条就行了。
     三,可以用自己的博客首页或任何可以匿名访问的网页地址等作为自己的OPENID。
难点在于实现功能一中的功能。其他的都好办!

 

 

<think>我们正在讨论云开发数据库中的`openid`字段问题。根据用户的问题,他想了解在添加字段时没有`openid`的原因以及解决方法。结合之前的引用,我们可以总结如下: ### 原因分析: 1. **自动注入机制仅限小程序端**:云开发数据库的`_openid`字段是**在小程序端插入记录时由系统自动添加**的(引用[1][2])。如果记录是在其他环境(如云函数、控制台)创建的,则不会自动添加`_openid`字段(引用[2])。 2. **管理员操作不触发注入**:在云开发控制台或云函数中直接创建记录时,系统不会自动添加`_openid`字段,因为此时没有关联的小程序用户(引用[2])。 3. **历史数据迁移问题**:如果数据是从其他数据库迁移而来,或者早期在控制台创建,则可能缺少`_openid`字段(引用[4])。 ### 解决方法: 根据引用[4],我们可以通过以下步骤手动添加`_openid`字段: 1. **获取用户openid**:通过云函数获取用户的openid(引用[3])。 2. **批量更新记录**:在云开发控制台使用数据库的高级操作(批量更新)来添加`_openid`字段。 具体操作步骤如下: #### 步骤1:创建云函数获取openid(如果尚未获取) ```javascript // 云函数:getOpenid const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event) => { const { OPENID } = cloud.getWXContext() return OPENID } ``` #### 步骤2:在需要添加_openid的集合中执行批量更新 在云开发控制台 → 数据库 → 选择目标集合 → 高级操作 → 新建数据库操作(选择“更新”),然后使用以下代码模板: ```javascript // 高级操作:批量添加_openid const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() exports.main = async () => { // 1. 获取集合中所有没有_openid的记录 const records = await db.collection('你的集合名') .where({ _openid: db.command.exists(false) // 筛选没有_openid的记录 }) .get() // 2. 为每条记录添加_openid(这里假设用固定值,实际需替换为真实openid) const updated = await Promise.all(records.data.map(record => { return db.collection('你的集合名').doc(record._id).update({ data: { _openid: '用户的openid' // 替换为实际openid(可从云函数获取) } }) })) return updated.length } ``` > **注意**:实际应用中,需要根据业务场景确定如何为每条记录分配`_openid`(例如,如果是用户数据,可能需要关联到具体用户)。 ### 特殊情况处理: - **如何关联到真实用户**? 如果数据原本属于某个用户,需要手动建立关联(例如通过用户手机号匹配)。若无关联信息,则无法自动补全。 - **新数据如何避免此问题**? 确保新数据通过小程序端插入,系统会自动注入`_openid`。 ### 最佳实践: 1. **前端插入数据**:所有用户相关数据应通过小程序端插入,确保自动注入`_openid`。 2. **云函数插入时手动补充**:若必须在云函数创建记录,需显式传入`_openid`: ```javascript // 在云函数中创建记录时手动添加_openid await db.collection('todos').add({ data: { title: "来自云函数的记录", _openid: "用户OPENID" // 从event或context中获取 } }) ``` ### 总结: | **场景** | **是否自动生成_openid** | **解决方案** | |------------------------|------------------------|----------------------------------| | 小程序端插入记录 | 是 | 无需额外操作 | | 控制台/云函数插入记录 | 否 | 手动添加_openid字段(见步骤2) | | 历史数据缺失_openid | - | 批量更新补充(见步骤2) | > 通过以上方法,可解决云开发数据库记录缺失`_openid`字段的问题(引用[2][4])。 --- ### 相关问题 1. 云开发数据库如何实现用户数据隔离? 2. 在云函数中如何安全获取用户openid? 3. 云开发数据库批量更新操作有哪些注意事项? 4. 如何设计云开发数据库的多用户权限系统? 5. 云开发数据库索引管理的最佳实践是什么?</think>### 云开发数据库添加字段时缺失 `openid` 的原因及解决方法 #### 一、根本原因分析 1. **环境差异导致**(核心原因) `_openid` 是**仅在小程序端插入数据时自动生成**的系统字段(引用[2])。若在以下环境操作则不会自动生成: - 云开发控制台手动添加记录 - 云函数中创建数据(除非显式传入) - 数据库导入/迁移操作 2. **权限配置影响** 当集合权限设置为 **"所有用户可读写"** 时,系统不会强制注入 `_openid`(引用[1])。 3. **历史数据问题** 早期创建的数据集可能未启用 `_openid` 自动注入机制(引用[4])。 #### 二、解决方案 ##### 方案1:通过控制台批量补全(适合已有数据) ```javascript // 在数据库高级操作中执行 db.collection('你的集合名').where({ _openid: _.exists(false) // 筛选缺失_openid的记录 }).update({ data: { _openid: '需补填的openid' // 替换为真实值 } }) ``` > **操作路径**:控制台 → 数据库 → 高级操作 → 新建数据库操作(引用[4]) > **注意**:需通过云函数获取合法 openid(引用[3]) ##### 方案2:云函数创建时显式注入(适合新数据) ```javascript // 云函数中显式添加_openid const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event) => { const { OPENID } = cloud.getWXContext() // 获取用户身份 await db.collection('orders').add({ data: { product: "手机", _openid: OPENID // 关键:手动注入 } }) } ``` ##### 方案3:调整权限策略触发自动注入 1. 将集合权限改为 **"仅创建者可读写"**(引用[1]) 2. 后续通过**小程序端**添加数据时自动生成 `_openid` #### 三、关键注意事项 1. **字段不可变性** `_openid` 一旦生成**不可修改**(引用[2]),错误注入会导致数据隔离失效。 2. **安全操作建议** ```mermaid graph LR A[新数据] --> B{来源} B -->|小程序端| C[自动注入_openid] B -->|控制台/云函数| D[需显式添加] D --> E[通过getWXContext获取] ``` 3. **数据关联性验证** 补填后需验证权限隔离效果: ```javascript // 应仅返回当前用户数据 db.collection('orders').where({ _openid: _.eq(cloud.getWXContext().OPENID) }).get() ``` #### 四、最佳实践总结 | **场景** | **操作方式** | **效果** | |-------------------------|----------------------------------|------------------------| | 小程序端新增数据 | 无需特殊操作 | 自动注入`_openid` | | 云函数新增数据 | 显式添加`_openid: OPENID` | 完美兼容权限系统 | | 历史数据补填 | 控制台批量更新 | 需确保openid准确性[^4] | | 跨系统数据迁移 | 迁移脚本中预注入`_openid`字段 | 避免后续权限问题 | > 通过合理运用权限策略和显式注入机制,可确保 `_openid` 字段的准确生成,实现 **用户数据自动隔离** 和 **安全访问控制**(引用[1][2])。 --- ### 相关问题 1. 如何在小程序云开发中实现跨集合的用户数据关联查询? 2. 云函数中如何安全获取和使用用户 openid? 3. 云开发数据库权限策略有哪些类型及适用场景? 4. 如何处理云开发中大量历史数据迁移时的权限问题? 5. 云开发数据库索引管理的最佳实践是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值