提交 94743ce5 编写于 作者: 雪洛's avatar 雪洛

docs: uniCloud tencent

上级 d9b46118
......@@ -18,10 +18,8 @@
* [示例及源码](uniCloud/resource.md)
* [常见问题](uniCloud/faq.md)
<!-- * [云存储](uniCloud/cf-storage.md) -->
<!--* [身份认证](uniCloud/cf-authentication.md) -->
<!-- * [登录授权](uniCloud/authentication.md) -->
<!-- ** 权限管理-->
<!-- * [腾讯云](uniCloud/policy-tcb.md) -->
* 权限管理
* [腾讯云](uniCloud/policy-tcb.md)
<!-- * [阿里云](uniCloud/policy-ali.md) -->
* [更新日志](uniCloud/release.md)
......
**本章内容仅针对腾讯云开发,阿里侧暂不支持**
**腾讯云侧必须以任意登录方式登录之后才可以访问云端资源。开发者在控制台开启匿名登录之后,可以在客户端调用匿名登录来获取访问云端资源的权限**
## 名词解释
- Ticket(票据):由云函数调用`createTicket`返回的票据,用于客户端使用票据进行登录操作
- 匿名登录:用户未进行登录操作的状态
- 短期访问令牌:用户身份的凭证(access token),调用`signInWithTicket`或者`linkAndRetrieveDataWithTicket`之后会自动进行存储
## uniCloud.auth()
......@@ -12,7 +16,7 @@
const auth = uniCloud.auth()
```
## auth.signInAnonymously()
<!-- ## auth.signInAnonymously()
进行匿名登录,详细描述参考[匿名登录](#匿名登录)
......@@ -21,8 +25,9 @@ const auth = uniCloud.auth()
```js
const auth = uniCloud.auth()
auth.signInAnonymously()
```
``` -->
<span id="signinwithticket"></span>
## auth.signInWithTicket()
使用,详细描述参考[登录流程](#cloudtoken)
......@@ -78,21 +83,22 @@ auth.signInWithTicket('YourTicket').then(() => {
})
```
## 自定义登录
<span id="cloudtoken"></span>
## 登录流程
`uniCloud`允许开发者使用特定的登录凭据`Ticket`对用户进行身份认证。开发者可以使用`服务端 SDK`来创建`Ticket`,并且将`token`传入到应用内,然后调用`signInWithTicket()`获得登录态。
`uniCloud`允许开发者使用特定的登录凭据`Ticket`对用户进行身份认证。开发者可以使用`服务端 SDK`来创建`Ticket`,并且将`Ticket`传入到应用内,然后调用`signInWithTicket()`获得登录态。
### 获取私钥文件
### 第一步:获取私钥文件
登录uniCloud控制台[uniCloud控制台](http://unicloud.dcloud.net.cn/),在`用户管理页面`中,点击“登录设置”,然后**生成并下载私钥**
![uniCloud下载私钥](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/auth-custom.png)
### 使用云函数创建登录凭据
### 第二步:使用云函数创建登录凭据
获取私钥文件之后,重命名为`credentials.json`放在云函数同级目录即可
获取私钥文件`credentials.json`)之后,放在需要生成`Ticket`的云函数内`index.js`同级即可
`服务端 SDK`内置了生成`Ticket`的接口,开发者需要提供一个自定义的`customUserId`作为用户的唯一身份标识`Ticket`有效期为**5分钟**,过期则失效。
`服务端 SDK`内置了生成`Ticket`的接口,开发者需要提供一个自定义的`customUserId`作为用户的**唯一身份标识**`Ticket`有效期为**5分钟**,过期则失效。
每个用户的`customUserId`不能相同,每次用户重新登录时,原有的登录态将会失效。
......@@ -132,7 +138,7 @@ tcb.init({
});
``` -->
### 客户端上使用Ticket登录
### 第三步:客户端上使用Ticket登录
创建`Ticket`之后,开发者应将`Ticket`发送至客户端,然后使用`客户端SDK`提供的 `signInWithTicket()` 登录`uniCloud`
......@@ -146,24 +152,9 @@ auth.signInWithTicket(ticket).then(() => {
## 匿名登录
uniCloud允许开发者使用匿名登录的方式进行静默授权,可以避免强制登录。在匿名状态下可正常的调用uniCloud的资源,开发者同时可以配合安全规则针对匿名用户制定对应的访问限制。
### 开启匿名登录授权
登录uniCloud控制台[uniCloud控制台](http://unicloud.dcloud.net.cn/),在`用户管理页面`中,点击“登录设置”,点击“登录设置”,然后在“匿名登录”一栏打开/关闭可用状态。
![uniCloud匿名登录](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/auth-anonymously.png)
### 客户端进行匿名登录
```js
await auth.signInAnonymously().catch(err=>{
// 登录失败会抛出错误
});
// 匿名登录成功检测登录状态isAnonymous字段为true
const loginState = await auth.getLoginState();
console.log(loginState.isAnonymous) // true
```
#### 匿名用户重新登录
匿名用户如果要重新使用开发者提供的身份登录,可以调用`auth.signInWithTicket`来进行。[参考](#客户端上使用Ticket登录)
匿名用户如果要重新使用开发者提供的身份登录,可以调用`auth.signInWithTicket`来进行。[参考](#signinwithticket)
#### 匿名用户转化为正式用户
目前uniCloud支持将匿名用户转化为正式用户,此转正用户将会继承匿名用户在云端创建的资源,流程如下:
......@@ -195,7 +186,7 @@ uniCloud.on('loginStateExpire', () => {
JS SDK 会在登录态生效期间,自动刷新和维护短期访问令牌(access token),每次成功刷新时会触发此事件。
对于两种登录态并存(uniCloud、自身业务登录态)的 Web 应用,这个事件可以用于同步登录态之间的状态。
对于两种登录态并存(uniCloud、自身业务登录态)的应用,这个事件可以用于同步登录态之间的状态。
```js
uniCloud.on('refreshAccessToken', () => {
......@@ -207,7 +198,7 @@ uniCloud.on('refreshAccessToken', () => {
`shouldRefreshAccessToken` 接收一个 `callback` 函数,并且会在刷新短期访问令牌前调用此 `callback` 函数,根据返回值决定是否要刷新短期访问令牌。
对于两种登录态并存(uniCloud、自身业务登录态)的 Web 应用,可以在 `callback` 内判断自身业务登录态是否失效,从而决定是否续期 uniCloud 的短期访问令牌。
对于两种登录态并存(uniCloud、自身业务登录态)的应用,可以在 `callback` 内判断自身业务登录态是否失效,从而决定是否续期 uniCloud 的短期访问令牌。
```js
auth.shouldRefreshAccessToken(() => {
......
......@@ -27,6 +27,7 @@ const {
const IP = auth.getClientIP()
```
<span id="createticket"></span>
### auth.createTicket(String customUserId, Object createTicketOptions)
开发者可以使用云函数创建登录凭证,提供给客户端进行登录操作。[详见](uniCloud/authentication.md#自定义登录)
......@@ -43,5 +44,5 @@ let customUserId = '123456';
const ticket = auth.createTicket(customUserId, {
refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
// 然后把 ticket 发送给客户端
// 然后把 ticket 发送给客户端,由客户端调用auth.signInWithTicket()使用
```
......@@ -99,7 +99,7 @@ $ curl https://${spaceId}.service.tcloudbase.com/${path}
```
使用POST请求`https://${spaceId}.service.tcloudbase.com/${functionPath}`,云函数接收到的`event`为请求发送的数据
使用POST请求`https://${spaceId}.service.tcloudbase.com/${functionPath}`,云函数接收到的`event`为请求发送的数据**uni.request默认content-type为application/json**
```
// 以uni.request为例
......@@ -115,8 +115,21 @@ uni.request({
}
})
// 云函数收到的event为
{a: 1, b: 2}
// 云函数收到的event为, 注意如果直接return此格式数据可能会被作为集成响应处理,参考下面的集成响应文档
```
{
path: '/',
httpMethod: 'GET',
headers: {
...
"content-type": 'application/json'
},
queryStringParameters: {a: "1", b: "2"},
requestContext: {云开发相关信息},
isBase64Encoded: false,
body: '{"a":1,"b":2}',
}
```
```
......
## 简介
为了保护用户的数据安全,云开发提供更灵活、可扩展、更细粒度的安全规则能力,开发者可以在云后台或者小程序开发工具上自定义安全规则,限制**客户端**对数据库的访问权限。本文档主要介绍如何配置安全规则以及表达式的相关说明。
安全规则本身不收费,但是安全规则额外的数据访问会统计到计费中。
为了保护用户的数据安全,uniCloud提供更灵活、可扩展、更细粒度的安全规则能力,开发者可以在uniCloud web控制台上自定义安全规则,限制**客户端**对云存储的访问权限。本文档主要介绍如何配置安全规则以及表达式的相关说明。
**注意**
- `get`函数会产生额外的数据访问。
- 指定文档ID查询的所有写操作会产生一次数据访问。
- 权限控制仅针对客户端
## 安全规则示例
......@@ -15,15 +11,15 @@
**规则示例**
```
//云数据库
// 云存储
// 所有人可读,仅创建者可写
{
"read": "auth.uid==doc._openid",
"write": "doc.name=='zzz'"
"read": true,
"write": "resource.openid == auth.uid"
}
//云存储
// 非匿名用户可读,仅创建者可写
{
"read": true,
"read": "auth.loginType != 'ANONYMOUS'",
"write": "resource.openid == auth.uid"
}
```
......@@ -33,10 +29,18 @@
- key:指用户的操作类型。
- value:指一个表达式。
## 操作类型
## 配置说明
- [云数据库操作类型](#云数据库操作类型)
- [云存储操作类型](#云存储操作类型)
开发者可以在uniCloud控制台设置云存储权限。如下图所示,点击`编辑`按钮,使用默认的四条规则,点击`切换到安全规则`可以自行配置JSON格式的权限规则。
![](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/uniCloud-tcb-storage-policy.png)
## 云存储操作类型
|操作类型 |说明 |默认值 |
|:-: |:-: |:-: |
|read |读取文件,例如:getTempFileURL |- |
|write |上传/覆盖文件,删除文件 |- |
## 表达式
......@@ -46,26 +50,27 @@
**全局变量**
|变量名 |类型 |说明 |
|:-: |:-: |:-: |
|auth |object |用户登录信息,字段说明参见下文 |
|now |number |当前时间 |
|doc |any |文档数据或查询条件 |
|变量名 |类型 |说明 |
|:-: |:-: |:-: |
|auth |object |用户登录信息,字段说明参见下文 |
|now |number |当前时间的时间戳 |
|resource |object |云存储资源 |
|doc |any |数据库文档资源(目前不开放数据库权限配置) |
**auth**
|字段名 |类型 |说明 |
|:-: |:-: |:-: |
|loginType|string |登录方式,取值为ANONYMOUS(匿名登录)、CUSTOM(自定义登录) |
|uid |string |用户唯一 ID(对应数据库文档的doc._openid、云存储的resource.openid),见下面示例|
|字段名 |类型 |说明 |
|:-: |:-: |:-: |
|loginType|string |登录方式,取值为ANONYMOUS(匿名登录)、CUSTOM(自定义登录)|
|uid |string |用户唯一 ID(对应云存储的resource.openid),见下面示例 |
```
//云数据库
{
"read": "auth.uid == doc._openid", //仅创建者可读
"write": "auth.uid == doc._openid" //仅创建者可写
}
**resource**
|字段名 |类型 |说明 |
|:-: |:-: |:-: |
|openid |string |资源创建者的用户唯一ID |
```
//云存储
{
"read": "resource.openid == auth.uid", //仅创建者可读
......@@ -75,88 +80,20 @@
### 运算符
|运算符 |说明 |示例 |示例解释(集合查询) |
|:-: |:-: |:-: |:-: |
|== |等于 |auth.uid == 'zzz' |用户的 uid 为 zzz |
|!= |不等于 |auth.uid != 'zzz' |用户的 uid 不为 zzz |
|> |大于 |doc.age>10 |查询条件的 age 属性大于10 |
|>= |大于等于 |doc.age>=10 |查询条件的 age 属性大于等于10 |
|< |小于 |doc.age>10 |查询条件的 age 属性小于10 |
|<= |小于等于 |doc.age>=10 |查询条件的 age 属性小于等于10 |
|in |存在于集合中 |auth.uid in ['zzz','aaa'] |用户的 uid 是['zzz','aaa']中的一个 |
|!(xx in [])|不存在于集合中,使用 in 的方式描述 !(a in [1,2,3]) |!(auth.uid in ['zzz','aaa']) |用户的 uid 不是['zzz','aaa']中的任何一个 |
|&& |与 |auth.uid == 'zzz' && doc.age>10 |用户的 uid 为 zzz 并且查询条件的 age 属性大于10 |
|&#124;&#124; |或者 |auth.uid == 'zzz' &#124;&#124; doc.age>10 |用户的 uid 为 zzz 或者查询条件的 age 属性大于10 |
|. |对象元素访问符 |auth.uid |用户的 uid |
|[] |数组访问符属性 |get('database.collection_a.user')[auth.uid] == 'zzz' |collection_a集合中id为user的文档,key 为用户 uid 的属性值为 zzz|
|运算符 |说明 |示例 |示例解释(集合查询) |
|:-: |:-: |:-: |:-: |
|== |等于 |auth.uid == 'zzz' |用户的 uid 为 zzz |
|!= |不等于 |auth.uid != 'zzz' |用户的 uid 不为 zzz |
|> |大于 |doc.age>10 |查询条件的 age 属性大于10 |
|>= |大于等于 |doc.age>=10 |查询条件的 age 属性大于等于10 |
|< |小于 |doc.age>10 |查询条件的 age 属性小于10 |
|<= |小于等于 |doc.age>=10 |查询条件的 age 属性小于等于10 |
|in |存在于集合中 |auth.uid in ['zzz','aaa'] |用户的 uid 是['zzz','aaa']中的一个 |
|!(xx in []) |不存在于集合中,使用 in 的方式描述 !(a in [1,2,3]) |!(auth.uid in ['zzz','aaa']) |用户的 uid 不是['zzz','aaa']中的任何一个 |
|&& |与 |auth.uid == 'zzz' && resource.openid == 'xxx' |用户的 uid 为 zzz 并且资源的创建者id为 xxx |
|&#124;&#124; |或者 |auth.uid == 'zzz' &#124;&#124; auth.uid == 'xxx' |用户的 uid 为 zzz 或者用户的 uid 为 xxx |
|. |对象元素访问符 |auth.uid |用户的 uid |
**注意**
- 比较运算符的右值必须为数值。
### 函数
#### get
目前仅支持`get`函数,唯一的参数必须为`database.集合名称.文档id`。通过访问其它文档的数据来判断用户操作是否符合安全规则。
**使用示例**
```
{
"read":"get('xxxx')[auth.uid] in [1,2,3]",
"delete":"get('xxxx')[auth.uid] == 1 && doc.user in ['ersed','sfsdf'] "
}
```
**注意**
- 一个表达式最多可以有3个get函数。
- 最多可以访问2个不同的文档。
- 不允许嵌套调用,例如:get("xxxx").prop[get("xxxxx").zzzz];
## 云数据库
### 配置说明
开发者可以在uniCloud控制台设置数据库权限
**步骤**
1.
2.
3.
**此处需补充uniCloud控制台截图【uniCloud替换标记】**
### 云数据库操作类型
|操作类型 |说明 |默认值 |
|:-: |:-: |:-: |
|read |读文档 |false |
|write |写文档,可以细分为 create、update、delete|false |
|create |新建文档 |无 |
|update |更新文档 |无 |
|delete |删除文档 |无 |
## 云存储
### 配置说明
开发者可以在uniCloud控制台设置云存储权限
**步骤**
1.
2.
3.
**此处需补充uniCloud控制台截图【uniCloud替换标记】**
### 云存储操作类型
|操作类型 |说明 |默认值 |
|:-: |:-: |:-: |
|read |读取文件,例如:download |- |
|write |上传/覆盖文件,删除文件 |- |
\ No newline at end of file
......@@ -4,6 +4,7 @@
即将支持云函数中使用云存储功能。
# 客户端API
## uploadFile(Object object)
上传文件到云存储,**阿里云单文件大小限制为100M,腾讯云单文件最大为5G**
......@@ -37,7 +38,8 @@
**注意**
- 使用阿里云时,`cloudPath`为云端文件名,请勿使用非法字符
<!-- - `cloudPath` 为文件的绝对路径,包含文件名 foo/bar.jpg、foo/bar/baz.jpg 等,不能包含除[0-9 , a-z , A-Z]、/、!、-、\_、.、、\*和中文以外的字符,使用 / 字符来实现类似传统文件系统的层级结构。[查看详情](https://cloud.tencent.com/document/product/436/13324) -->
- 腾讯云`cloudPath` 为文件的绝对路径,包含文件名 foo/bar.jpg、foo/bar/baz.jpg 等,不能包含除[0-9 , a-z , A-Z]、/、!、-、\_、.、、\*和中文以外的字符,使用 / 字符来实现类似传统文件系统的层级结构。
- 腾讯云`cloudPath`为文件标识,相同的`cloudPath`会覆盖,如果没有权限覆盖则会上传失败
#### 响应参数
......@@ -73,12 +75,24 @@ uni.chooseImage({
// promise
const result = await uniCloud.uploadFile({
filePath: filePath
onUploadProgress: function(progressEvent) {
console.log(progressEvent);
var percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
}
});
// callback
uniCloud.uploadFile({
filePath: filePath
},
onUploadProgress: function(progressEvent) {
console.log(progressEvent);
var percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
},
success() {},
fail() {},
complete() {}
......@@ -94,9 +108,14 @@ uni.chooseImage({
- 阿里云返回的fileID为链接形式
<!-- ## getTempFileURL(Object getTempFileURLOptions)
## getTempFileURL(Object object)
获取文件临时下载链接。
**平台兼容性**
获取文件临时下载链接,**仅腾讯云支持**
|阿里云 |腾讯云 |
|---- |---- |
|× |√ |
#### 请求参数
......@@ -144,7 +163,7 @@ uniCloud.getTempFileURL({
complete() {}
});
```
-->
## deleteFile(Object object)
删除云端文件
......@@ -225,3 +244,167 @@ let result = await tcb.downloadFile({
complete(){}
});
``` -->
# 云函数API
## uniCloud.uploadFile(Object uploadFileOptions)
上传文件至云开发存储服务。
**平台兼容性**
|阿里云 |腾讯云 |
|---- |---- |
|× |√ |
#### 请求参数
**uploadFileOptions参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| cloudPath | string | 是 | 文件的绝对路径,包含文件名。例如 foo/bar.jpg、foo/bar/baz.jpg 等。 |
| fileContent | fs.ReadStream | 是 | buffer或要上传的文件 [可读流](https://nodejs.org/api/stream.html#stream_class_stream_readable) 。 |
#### 响应参数
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | string| 否 | 状态码,操作成功则不返回。 |
| message | string| 否 | 错误描述。 |
| fileID | fileID| 是 | 文件唯一 ID,用来访问文件,建议存储起来。 |
| requestId | string| 否 | 请求序列号,用于错误排查。 |
#### 示例代码
```javascript
const fs = require("fs");
let result = await uniCloud.uploadFile({
cloudPath: "test-admin.jpeg",
fileContent: fs.createReadStream(`${__dirname}/cos.jpeg`)
});
```
### uniCloud.getTempFileURL(Object getTempFileURLOptions)
获取文件下载链接。
**平台兼容性**
|阿里云 |腾讯云 |
|---- |---- |
|× |√ |
#### 请求参数
**getTempFileURLOptions参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| fileList| &lt;Array&gt;.string| 是 | 要下载的文件 ID 组成的数组。|
**fileList字段**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| fileID| string | 是 | 文件 ID。 |
| maxAge| Integer | 是 | 文件链接有效期。|
#### 响应参数
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 状态码,操作成功则为 SUCCESS。|
| message | string | 否 | 错误描述。 |
| fileList | &lt;Array&gt;.object| 否 | 存储下载链接的数组。 |
| requestId | string | 否 | 请求序列号,用于错误排查。 |
**fileList字段**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | string| 否 | 删除结果,成功为 SUCCESS。|
| fileID | string| 是 | 文件 ID。 |
| tempFileURL | string| 是 | 文件访问链接。 |
#### 示例代码
```javascript
let result = await uniCloud.getTempFileURL({
fileList: ['cloud://test-28farb/a.png']
});
```
## uniCloud.deleteFile(Object deleteFileOptions)
删除云端文件。
#### 请求参数
**deleteFileOptions参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| fileList| &lt;Array&gt;.string| 是 | 要删除的文件 ID 组成的数组。|
#### 响应参数
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 状态码,操作成功则不返回。|
| message | string | 否 | 错误描述 |
| fileList | &lt;Array&gt;.object| 否 | 删除结果组成的数组。 |
| requestId | string | 否 | 请求序列号,用于错误排查。|
**fileList字段**
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 删除结果,成功为SUCCESS。 |
| fileID | string | 是 | 文件 ID。 |
#### 示例代码
```javascript
let result = await uniCloud.deleteFile({
fileList: [
"cloud://test-28farb/a.png"
]
});
```
## uniCloud.downloadFile(Object downloadFileOptions)
下载已上传至云开发的文件至本地(默认本地根目录/root)。
**平台兼容性**
|阿里云 |腾讯云 |
|---- |---- |
|× |√ |
#### 请求参数
**downloadFileOptions参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| fileID | string| 是 | 要下载的文件的 ID。 |
| tempFilePath| string| 否 | 下载的文件要存储的位置。|
#### 响应参数
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | string| 否 | 状态码,操作成功则不返回。 |
| message | string| 否 | 错误描述。 |
| fileContent | Buffer| 否 | 下载的文件的内容。如果传入 tempFilePath 则不返回该字段。|
| requestId | string| 否 | 请求序列号,用于错误排查。 |
#### 示例代码
```javascript
let result = await uniCloud.downloadFile({
fileID: "cloud://aa-99j9f/my-photo.png",
// tempFilePath: '/tmp/test/storage/my-photo.png'
});
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册