用戶賬號(hào)開(kāi)發(fā)指南
生活物聯(lián)網(wǎng)平臺(tái)中支持使用內(nèi)置賬號(hào)體系,也支持集成您自己的賬號(hào)體系。您可以基于用戶賬號(hào)體系實(shí)現(xiàn)自有App開(kāi)發(fā)中的注冊(cè)、登錄、忘記密碼、登出、修改用戶信息等功能。同一個(gè)項(xiàng)目創(chuàng)建多個(gè)自有品牌App時(shí),App的賬號(hào)體系相通。
內(nèi)置賬號(hào)體系
內(nèi)置賬號(hào)體系為平臺(tái)提供的服務(wù)和能力,客戶端集成平臺(tái)賬號(hào)及用戶SDK即可使用。賬號(hào)及用戶SDK支持喚起登錄頁(yè)面,包括賬號(hào)注冊(cè)、登錄、登出、忘記密碼、多語(yǔ)言切換、修改頭像、修改昵稱(chēng)、注銷(xiāo)賬號(hào)等功能,并支持在此頁(yè)面基礎(chǔ)上修改UI風(fēng)格。詳細(xì)操作,請(qǐng)參見(jiàn)Android賬號(hào)及用戶SDK、iOS賬號(hào)及用戶SDK。
如果您的App需發(fā)行到海外,建議您在App中實(shí)現(xiàn)以下內(nèi)容。
郵箱注冊(cè):郵箱注冊(cè)更符合海外用戶使用習(xí)慣。
多語(yǔ)言切換:當(dāng)前平臺(tái)支持多種語(yǔ)言,并持續(xù)添加中。
注銷(xiāo)賬號(hào):由于海外嚴(yán)格的合規(guī)要求(如GDPR),App中需要提供注銷(xiāo)用戶的功能,注銷(xiāo)時(shí)需要?jiǎng)h除用戶的所有數(shù)據(jù)。
自有賬號(hào)體系
當(dāng)您擁有自己的賬號(hào)體系,可以將您自己的賬號(hào)體系和平臺(tái)關(guān)聯(lián),實(shí)現(xiàn)設(shè)備綁定關(guān)系、設(shè)備分享、設(shè)備消息推送等功能。您自己賬戶體系中的用戶信息不會(huì)保留在平臺(tái)上,保障您的用戶隱私信息。
自有賬號(hào)體系對(duì)接基于Oauth 2.0 API協(xié)議(代理用戶訪問(wèn)的授權(quán)開(kāi)放網(wǎng)絡(luò)標(biāo)準(zhǔn)協(xié)議,詳細(xì)介紹,請(qǐng)參見(jiàn)RFC定義參考文檔),請(qǐng)您按照以下步驟配置和開(kāi)發(fā)自有賬號(hào)對(duì)接功能。
進(jìn)入自有品牌App的用戶賬號(hào)配置頁(yè)面。
選擇自有賬號(hào)體系,并單擊設(shè)置。
配置自有賬號(hào)體系,并單擊確認(rèn)保存。
其中訪問(wèn)/刷新URL和GetuserinfoURL需廠商提供URL。
開(kāi)發(fā)自有賬號(hào)體系。
根據(jù)以下流程圖完成開(kāi)發(fā)工作。
詳細(xì)流程如下。
實(shí)現(xiàn)App登錄,并從App認(rèn)證服務(wù)中獲取當(dāng)前登錄用戶的AuthCode,并將AuthCode傳遞給SDK(SDK的使用方法,請(qǐng)參見(jiàn)賬號(hào)及用戶SDK(Android)與賬號(hào)及用戶SDK(iOS)中的“三方自有賬號(hào)”內(nèi)容)。
說(shuō)明App向App認(rèn)證服務(wù)(一般包含認(rèn)證登錄、頒發(fā)AuthCode、驗(yàn)證AuthCode、頒發(fā)token、驗(yàn)證token等)獲取AuthCode,該部分需您自行實(shí)現(xiàn)。一般實(shí)現(xiàn)中建議使用安全隨機(jī)數(shù)生成隨機(jī)字符串,并將申請(qǐng)的client_id與登錄賬號(hào)相關(guān)聯(lián),保證流程2中申請(qǐng)access_token時(shí)攜帶的AuthCode能且僅能使用一次。
生活物聯(lián)網(wǎng)平臺(tái)通過(guò)HTTP POST方式,向您的App認(rèn)證服務(wù)中發(fā)送請(qǐng)求來(lái)獲取token。
該請(qǐng)求中含有參數(shù)client_id、AuthCode、client_secret。對(duì)應(yīng)返回消息中需包含參數(shù)result_code、access_token、refresh_token。
說(shuō)明生活物聯(lián)網(wǎng)生活平臺(tái)賬號(hào)互聯(lián)的所有HTTP請(qǐng)求中,請(qǐng)求響應(yīng)內(nèi)容
Content-Type
需為application/json
。AuthCode換取access_token請(qǐng)求
此處為OAuth 2.0標(biāo)準(zhǔn)token換取請(qǐng)求,以訪問(wèn)/刷新URL配置為
https://test.net/api/users/oauth/token
為例,示例如下。POST /api/users/oauth/token?grant_type=authorization_code&client_id=testxxx&client_secret=testxxxxx&code=test222224tD2fVtexxxxojFZL6&redirect_uri=none HTTP/1.1 Host: test.net Content-Type: application/x-www-form-urlencoded
請(qǐng)求字段
類(lèi)型
描述
grant_type
String
授權(quán)類(lèi)型,固定為字符串
authorization_code
。client_id
String
生活物聯(lián)網(wǎng)平臺(tái)頒發(fā)的AppKey。
client_secret
String
生活物聯(lián)網(wǎng)平臺(tái)頒發(fā)的AppSecret。
code
String
流程1中返回的AuthCode。
您的App認(rèn)證服務(wù)向生活物聯(lián)網(wǎng)平臺(tái)成功返回的示例如下。
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "result_code":"0", "openid":"OPENID", "access_token":"2YotnxxxxMWpAA", "refresh_token":"tGzvxxxx2TlKWIA" }
返回字段
類(lèi)型
描述
result_code
String
0:成功
100000:client_id或者client_secret無(wú)效
100002:AuthCode換取access_token失敗
100007:無(wú)效的授權(quán)碼
110000:系統(tǒng)通用錯(cuò)誤代碼
openid
String
用戶唯一標(biāo)識(shí)。
access_token
String
授權(quán)的令牌。
refresh_token
String
獲取新的access_token,自動(dòng)續(xù)期授權(quán)時(shí)需提供該參數(shù)。
expires_in
String
該access_token的有效期,單位為秒。
刷新access_token請(qǐng)求
POST /api/users/oauth/token?grant_type=refresh_token&client_id=testxx&client_secret=test2222&refresh_token=test222testaaaL6 HTTP/1.1 Host: test.net Content-Type: application/x-www-form-urlencoded
請(qǐng)求字段
類(lèi)型
描述
grant_type
String
授權(quán)類(lèi)型,固定為字符串
refresh_token
。client_id
String
生活物聯(lián)網(wǎng)平臺(tái)頒發(fā)的AppKey。
client_secret
String
生活物聯(lián)網(wǎng)平臺(tái)頒發(fā)的AppSecret。
refresh_token
String
獲取access_token時(shí)返回的refresh_token。
成功返回示例如下。
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "result_code":"0", "openid":" OPENID", "access_token":"2YotnFxxxxsicMWpAA", "refresh_token":"tGzv3Jxxxx2TlKWIA" }
返回字段
類(lèi)型
描述
result_code
String
0:成功
100000:client_id或者client_secret無(wú)效
100003:refresh_token已經(jīng)過(guò)期或失效
110000:系統(tǒng)通用錯(cuò)誤代碼
openid
String
用戶唯一標(biāo)識(shí)。
access_token
String
授權(quán)令牌。
refresh_token
String
獲取新的access_token,自動(dòng)續(xù)期授權(quán)時(shí)需提供該參數(shù)。
通過(guò)流程2中獲取到的access_token,生活物聯(lián)網(wǎng)平臺(tái)向App用戶服務(wù)OpenId獲取用戶信息。
App用戶服務(wù)即為App自有賬號(hào)體系內(nèi)自己的賬號(hào)體系管理服務(wù),一般包含基本的賬戶注冊(cè)、賬戶信息管理(此處須實(shí)現(xiàn)一個(gè)HTTP請(qǐng)求,通過(guò)OAuth token驗(yàn)證鑒權(quán)獲取用戶基礎(chǔ)信息)。
URL示例為:
https://thrid.com/sns/userinfo
,請(qǐng)求方法為POST。請(qǐng)求示例如下。
POST /api/users/oauth/userinfo?access_token=testaaaatest222a779537c6687c3 HTTP/1.1 Host: testxx.net Content-Type: application/x-www-form-urlencoded
請(qǐng)求字段
類(lèi)型
描述
access_token
String
流程2中獲取到的access_token。
openid
String
用戶唯一標(biāo)識(shí)(非必填,如果您需要支持Google Assistant和Amazon Alexa的語(yǔ)音對(duì)接能力,此處需要設(shè)置成非必填參數(shù))。
響應(yīng)示例如下。
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "result_code": "0", "message": "成功", "openid":" OPENID", "nick_name": "NICKNAME", "avatar_url": "image.com/xxxx.png", "gender": "1" }
返回字段
類(lèi)型
描述
result_code
String
0:成功
100000:client_id或者client_secret無(wú)效
100001:access_token過(guò)期
100002:AuthCode換取access_token失敗
100003:refresh_token已經(jīng)過(guò)期或失效
100004:用戶修改密碼或者解除授權(quán)導(dǎo)致access_token失效
100005:access_token非法
100006:無(wú)效的OpenId
100007:無(wú)效的授權(quán)碼
110000:系統(tǒng)通用錯(cuò)誤代碼
message
String
響應(yīng)結(jié)果描述。
openid
String
用戶唯一標(biāo)識(shí)。
nick_name
String
用戶的昵稱(chēng)。
avatar_url
String
頭像URL地址。
gender
String
用戶的性別,取值范圍如下。
0:未知
1:男性
2:女性
自有賬號(hào)全球用戶接入
生活物聯(lián)網(wǎng)平臺(tái)提供全球統(tǒng)一的賬戶接入能力,當(dāng)有多個(gè)數(shù)據(jù)中心時(shí)會(huì)就近接入,從而達(dá)到最快接入響應(yīng)和合規(guī)能力支持。您的自有賬號(hào)系統(tǒng)只允許配置一個(gè)endpoint(即設(shè)置的URL的域名,在App賬號(hào)接入的token地址和getUSerInfo地址中獲?。H绻淖杂匈~號(hào)系統(tǒng)在全球具有多個(gè)數(shù)據(jù)中心,可以通過(guò)以下方法兼容多數(shù)據(jù)中心。
在區(qū)域認(rèn)證服務(wù)生成authCode時(shí),添加數(shù)據(jù)中心的標(biāo)志位。
需要添加標(biāo)志位的地方有:AuthCode中、AuthCode交換生成的access_token和refresh_token中。
使用統(tǒng)一的endpoint轉(zhuǎn)發(fā)路由。
詳細(xì)流程圖如下。
以下為您推薦幾種統(tǒng)一轉(zhuǎn)發(fā)路由的實(shí)現(xiàn)方法,供您參考。
使用智能CDN,并自建nginx反向代理集群。
使用智能CDN,流量通過(guò)API網(wǎng)關(guān)接入阿里云函數(shù)計(jì)算。
使用阿里云的邊緣服務(wù)產(chǎn)品,例如EdgeRoutine等。
獲取用戶上傳頭像的URL及加密簽名
開(kāi)發(fā)自有App的用戶賬號(hào)時(shí),如果App需要支持C端用戶上傳頭像及修改簽名的功能,請(qǐng)您根據(jù)以下流程來(lái)開(kāi)發(fā)。
調(diào)用獲取用戶上傳頭像的URL及加密簽名接口,獲取上傳的URL和簽名等參數(shù)。
App取得上傳的URL和簽名等參數(shù)后,通過(guò)POST方法將頭像上傳(更多介紹,請(qǐng)參見(jiàn)PostObject)。
上傳時(shí)Header中的x-oss-forbid-overwrite參數(shù)需設(shè)置為false,否則可能導(dǎo)致上傳失敗。
拼接URL。
根據(jù)流程1中調(diào)用接口的返回參數(shù)中的host、dir拼接得出頭像圖片URL地址(拼接規(guī)則為
“https://”+ host + “/” + dir
)。通過(guò)修改賬號(hào)屬性接口更新圖像URL。
注冊(cè)登錄App開(kāi)發(fā)說(shuō)明
開(kāi)發(fā)自有App的用戶賬號(hào)時(shí),您還需要注意App注冊(cè)和登錄時(shí)國(guó)家的選擇,如下表所示。
操作 | API Level 9及以上版本 | API Level 8及以下版本 |
注冊(cè)App | 需要選擇國(guó)家 | 需要選擇國(guó)家 |
登錄App | 不需要選擇國(guó)家 | 選擇注冊(cè)時(shí)的國(guó)家 |
賬號(hào)注冊(cè)時(shí)選擇的國(guó)家,在賬號(hào)注冊(cè)成功后無(wú)法切換。該賬號(hào)綁定的設(shè)備也將連接到所選國(guó)家對(duì)應(yīng)區(qū)域的數(shù)據(jù)中心。如果您需切換數(shù)據(jù)中心的區(qū)域,則要先注銷(xiāo)賬號(hào),再重新選擇新的國(guó)家注冊(cè),并綁定原來(lái)的設(shè)備。
因此,您在開(kāi)發(fā)App注冊(cè)和登錄的業(yè)務(wù)邏輯時(shí),建議參考云智能App頁(yè)面的實(shí)現(xiàn)。當(dāng)需要選擇國(guó)家時(shí),強(qiáng)提示C端用戶(消費(fèi)者)選擇國(guó)家的影響(國(guó)家決定了賬號(hào)所在地和后續(xù)該賬號(hào)綁定設(shè)備連接的服務(wù)器區(qū)域),避免消費(fèi)者隨意選擇一個(gè)國(guó)家,導(dǎo)致設(shè)備連接的體驗(yàn)不佳。