用户管理
## 用户管理
### 参考文档
https://firebase.flutter.dev/docs/overview/
https://firebaseopensource.com/projects/firebaseextended/flutterfire/
https://github.com/FirebaseExtended/flutterfire
https://firebase.google.com/docs/auth
### 1. 接口列表
|接口功能|请求方式|API|
|-|-|-|
|监听用户认证/登录状态|Firebase Auth|<br>详细参考: https://firebase.flutter.dev/docs/auth/usage|
|邮箱账号用户创建|Firebase Auth|接口: ```FirebaseAuth.instance.createUserWithEmailAndPassword(email, password)```<br>详细参考: https://firebase.flutter.dev/docs/auth/usage|
|邮箱密码方式登录|Firebase Auth|-1. 先监听用户认证状态<br>-2. 发起登录<br>```FirebaseAuth.instance.signInWithEmailAndPassword(email, password)```<br>详细参考: https://firebase.flutter.dev/docs/auth/usage|
|用户登出|Firebase Auth|```FirebaseAuth.instance.currentUser.signOut()```<br>详细参考: https://firebase.flutter.dev/docs/auth/usage|
|用户注销|Firebase Auth|```FirebaseAuth.instance.currentUser.delete()```<br>详细参考: https://firebase.flutter.dev/docs/auth/usage|
|[发送邮件验证码](#1)|HTTP|详细参考下面 【发送邮箱验证码】|
|[校验邮件验证码](#2)|HTTP|详细参考下面 【校验邮箱验证码】|
|手机验证码方式登录/注册|Firebase Auth|接口:```FirebaseAuth.instance.verifyPhoneNumber()```<br>详细参考: https://firebase.flutter.dev/docs/auth/phone|
|更新用户信息|Firebase Auth|```mAuth.getCurrentUser().updateProfile(profileUpdates)```|
|更新用户邮箱|Firebase Auth|```mAuth.getCurrentUser().updateEmail("user@example.com")```<br>更改前,需要对用户进行重新身份验证|
|更新用户密码|Firebase Auth|```mAuth.getCurrentUser().updatePassword(newPassword)```<br>更改前,需要对用户进行重新身份验证|
|用户登录状态|Firebase Auth|```user = FirebaseAuth.instance.currentUser```<br>```user is null表示没有登录```<br>|
|对用户重新进行身份验证|Firebase Auth|```EmailAuthCredential credential = EmailAuthProvider.credential(email, password)```<br>```FirebaseAuth.instance.currentUser.reauthenticateWithCredential(credential)```|
|获取 经过Google授权登录 的 UserCredential|Firebase Auth||
|[获取用户信息](#3)|Firestore|FirebaseFirestore.instance.collection("users").document('<user_id>').get()|
|[更新用户注册国家](#4)|HTTP|update_user_country|
|[更新用户昵称](#5)|HTTP|update_user_nickname|
|[重置用户密码](#6)|HTTP|update_user_password|
|[更新用户头像](#7)|HTTP|update_user_avatarurl|
<span id="1"></span>
### 发送邮箱验证码
-1. URL
```{base_url}/send_email_code```
-2. HTTP Method
```POST```
-3. Body Para
```email_address: 邮箱地址```
-4. 返回格式
```
{
"code": 200,
"data": {
"code_id": <code_id_string>
},
"message": "SendEmailCodeFailed"
}
code: 200 表示成功,其他表示错误,请参考message字段查看错误内容
data: 返回数据,code_id表示验证码的ID,用于检验验证码 时使用
message: 消息描述
```
>d 目前测试阶段,邮箱验证码都是123456,不会真实发送到邮箱。
<span id="2"></span>
### 校验邮箱验证码
-1. URL
```{base_url}/verify_email_code```
-2. HTTP Method
```POST```
-3. Body Para
```
code_id: 验证码ID,发送邮箱验证码时,返回的code_id
code: 验证码,邮箱收到的验证码
```
-4. 返回格式
```
{
"code": 200,
"data": None,
"message": "Success"
}
code: 200 表示成功,其他表示错误,请参考message字段查看错误内容
data: None
message: 消息描述
```
<span id="3"></span>
### 获取用户信息
- Firestore 接口直接获取数据
```
user_data = db.collection("users").document('<user_id>').get()
user_data = user_data.to_dict()
```
- 用户数据格式
|字段|类型|说明|
|-|-|-|
|nick_name|string|用户昵称|
|avatar_url|string|用户头像url|
|current_house|Object|用户当前所在house信息|
|country|Object|region object|
|ezivz_account|Object|用户的萤石账号信息|
|tuya_account|Object|用户的涂鸦账号信息|
|wulian_account|Object|用户的账号信息|
region object 相关字段说明:
|字段|类型|说明|
|-|-|-|
|Name|String|区域名称|
|Capital|Object|首都信息|
|GeoRectangle|Object|区域的经纬范围,可用于根据用户当前位置 判断用户是否处于该区域|
|SeqID|INT|排序id|
|GeoPt|list|区域中心位置 经纬坐标|
|TelPref|String|电话号码前缀|
```
# 例子:
respond["Results"]["AU"] =
{
'Name': 'Australia',
'Capital': {'DLST': 1.0, 'TD': 10.0, 'Flg': 2, 'Name': 'Canberra', 'GeoPt': [-35.17, 149.13]},
'GeoRectangle': {'West': 112.911048889, 'East': 153.639282227, 'North': -10.0628032684, 'South': -43.6439743042},
'SeqID': 14,
'GeoPt': [-27.0, 133.0],
'TelPref': '61',
'CountryCodes': {'tld': 'au', 'iso3': 'AUS', 'iso2': 'AU', 'fips': 'AS', 'isoN': 36},
'CountryInfo': 'http://www.geognos.com/geo/en/cc/au.html'
}
```
current_house 字段说明:
|字段|类型|说明|
|-|-|-|
|id|String|房子的id|
|name|String|房子的名称|
|owner_id|String|房子的owner的user_id|
|is_owner|String|用户是否该房子的owner|
|location|Object|房子的位置信息,latitude, longtitude, name|
|device_counts|Number|房子当前的设备总数|
|room_counts|Number|房子当前的房间总数|
|members|list<member>|房子当前的成员列表|
member 字段 说明:
|字段|类型|说明|
|-|-|-|
|user_id|String|成员的user_id|
|name|String|成员的昵称|
|role|String|成员的角色,Owner 或者 Member|
|is_accepted|boolean|成员是否已经接受成为该房子的成员|
<span id="4"></span>
### 更新用户注册国家
-1. URL
```{base_url}/update_user_country```
-2. HTTP Method
```POST```
-3. Body Para
|参数名称|类型|描述|
|-|-|-|
|country|Object|国家信息|
```
国家信息格式
{
'Name': 'Australia',
'Capital': {'DLST': 1.0, 'TD': 10.0, 'Flg': 2, 'Name': 'Canberra', 'GeoPt': [-35.17, 149.13]},
'GeoRectangle': {'West': 112.911048889, 'East': 153.639282227, 'North': -10.0628032684, 'South': -43.6439743042},
'SeqID': 14,
'GeoPt': [-27.0, 133.0],
'TelPref': '61',
'CountryCodes': {'tld': 'au', 'iso3': 'AUS', 'iso2': 'AU', 'fips': 'AS', 'isoN': 36},
'CountryInfo': 'http://www.geognos.com/geo/en/cc/au.html'
}
```
-4. 返回格式
```
{
"code": 200,
"data": None,
"message": "Success"
}
code: 200 表示成功,其他表示错误,请参考message字段查看错误内容
data: None
message: 消息描述
```
<span id="5"></span>
### 更新用户昵称
-1. URL
```{base_url}/update_user_nickname```
-2. HTTP Method
```POST```
-3. Body Para
|参数名称|类型|描述|
|-|-|-|
|nick_name|String|用户昵称|
-4. 返回格式
```
{
"code": 200,
"data": None,
"message": "Success"
}
code: 200 表示成功,其他表示错误,请参考message字段查看错误内容
data: None
message: 消息描述
```
<span id="6"></span>
### 重置用户密码
-1. URL
```{base_url}/update_user_password```
-2. HTTP Method
```POST```
-3. Body Para
|参数名称|类型|描述|
|-|-|-|
|password|String|用户密码|
|email|String|邮件地址|
|code_id|String|验证邮件地址时,获取到的code_id|
-4. 返回格式
```
{
"code": 200,
"data": None,
"message": "Success"
}
code: 200 表示成功,其他表示错误,请参考message字段查看错误内容
data: None
message: 消息描述
```
<span id="7"></span>
### 更新用户头像
-1. URL
```{base_url}/update_user_avatarurl```
-2. HTTP Method
```POST```
-3. Body Para
|参数名称|类型|描述|
|-|-|-|
|avatar_url|String|用户头像地址|
-4. 返回格式
```
{
"code": 200,
"data": None,
"message": "Success"
}
code: 200 表示成功,其他表示错误,请参考message字段查看错误内容
data: None
message: 消息描述
```
### APP侧SDK初始化接口
|接口功能|请求方式|API|
|-|-|-|
|萤石SDK-获取appkey和用户账号access_token|Firebase CF|萤石SDK初始化的时候,需要appkey和子用户access_token|
|涂鸦SDK-获取appkey和appsecret|Firebase CF|涂鸦SDK初始化过程,需要appkey/appsecret,子用户的uid/passwword/country_code用于登录账号|
>d 涂鸦和萤石的配网过程,均完全由SDK与三方云直接对接完成,SPS_Core只把控认证部分,SDK确认设备配网激活成功后,同步给SPS_Core。
萤石配网成功后,需要调用SPS_Core侧 添加设备接口,用于添加设备到该账号