對于nodejs開發(fā)者來說,可能會發(fā)現(xiàn)leancloud有兩個(gè)給js使用的sdk:leanengine-node-sdk和javascript-sdk
前者的npm包名是leanengine,后者包名叫做avoscloud-sdk悉尾。
看一下leanengine的package.json可以發(fā)現(xiàn)
leanengine是依賴avoscloud-sdk的胰舆,leanengine除了能夠使用avoscloud-sdk的全部功能以外昧碉,還有額外拓展的供nodejs使用的方法睬罗。
所以結(jié)論就是苍姜,如果是一個(gè)純前端的項(xiàng)目译蒂,就引入avoscloud-sdk曼月,而如果使用在nodejs服務(wù)器的話,則引入leanengine柔昼。之前有一個(gè)項(xiàng)目在(我猜是因?yàn)椋┣岸耸褂昧薼eanengine哑芹,會使chrome產(chǎn)生websocket連接的問題,而導(dǎo)致瀏覽器卡死捕透。
用戶
在leancloud新建的項(xiàng)目聪姿,會有6個(gè)默認(rèn)的Class,這篇文章會說到其中的_User
_User表的字段如下:
其中username和password是必填字段激率,而且username是一個(gè)要求唯一的字段咳燕。email和mobilePhoneNumber則是選填字段。
authData用來保存第三方登錄信息乒躺,也是本文后面重點(diǎn)要說的部分招盲。
emailVerified和mobilePhoneVerified是布爾型,用來標(biāo)注郵箱和手機(jī)是否驗(yàn)證嘉冒。順便一提曹货,郵箱驗(yàn)證和手機(jī)驗(yàn)證服務(wù)已經(jīng)集成在leancloud內(nèi)了咆繁,不需要使用額外的郵件或短信服務(wù)商,而且驗(yàn)證后直接更新數(shù)據(jù)庫顶籽,完全沒有開發(fā)的成本玩般。
sessionToken字段是記錄用戶會話的,在avoscloud-sdk 0.5.1版本中礼饱,加入了AV.User.become方法坏为,可以使用sessionToken直接登錄。
注冊 AV.User.signUp()
LeanCloud 文檔
標(biāo)注的注冊方法需要用戶名和密碼镊绪,其他信息可以隨注冊信息一起提供匀伏,或者在signUp的回調(diào)中再次更新。
登錄 AV.User.logIn()
LeanCloud 文檔
leancloud的標(biāo)準(zhǔn)登錄方法除了支持username和password登錄蝴韭,同時(shí)支持email和password登錄够颠。這也就是說,郵箱登陸的功能也不需要額外開發(fā)了榄鉴,可以直接在登錄框位置注明:“用戶名/郵箱” 然后無論用戶輸入的是username還是email履磨,都可以用logIn方法登入。
如果要使用手機(jī)登錄庆尘,則要調(diào)用AV.User.logInWithMobilePhone()方法剃诅,另一種手機(jī)登錄方式是通過手機(jī)號和驗(yàn)證短信直接登入的AV.User.requestSmsCode(),如果使用這個(gè)方法注冊的話驶忌,新用戶的username默認(rèn)為手機(jī)號碼综苔。
綁定第三方
LeanCloud 文檔**
AV.User._logInWith()方法提供了第三方綁定的方法。這個(gè)方法會創(chuàng)建一個(gè)新的用戶位岔,username為隨機(jī)串。
綁定微博的代碼是:
AV.User._logInWith('weibo', {
'authData': {
'uid': '123456789',
'access_token': '2.00vs3XtCI5FevCff4981adb5jj1lXE', 'expiration_in': '36000'
}
}).then(function(user) {
//返回綁定后的用戶
console.log(user);
},
function(error) {
console.log(error);
});
綁定github可以用:
AV.User._logInWith('github',{
"authData":{
'uid': uid,
'access_token': access_token
}
}).then(function(user) {
console.log(user)
},
function(error) {
console.log(error);
});
其中微博堡牡,微信和QQ抒抬,leancloud會在登錄時(shí)驗(yàn)證access_token的可靠性,其他第三方平臺要自行通過平臺的方法去驗(yàn)證晤柄。
如果已經(jīng)有一個(gè)leancloud賬號擦剑,想要綁定第三方,可以使用_linkWith方法
var user = ...已存在的處于登錄狀態(tài)的 AV.User 對象 ...
user._linkWith('weibo', {
'authData': {
'uid': '123456789',
'access_token': '2.00vs3XtCI5FevCff4981adb5jj1lXE',
'expiration_in': '36000'
}
}).then(function(user) {
console.log(user);
}, function(error) {
console.log(error);
});
這里leancloud不會驗(yàn)證這個(gè)第三方賬號是不是已經(jīng)被其他用戶綁定芥颈,如果同一個(gè)微博賬號多次綁定用戶惠勒,代碼執(zhí)行的時(shí)候不會報(bào)錯,在登錄的時(shí)候爬坑,會登入最后一個(gè)綁定的賬號纠屋。
當(dāng)前用戶
通過AV.User.current()方法可以得到當(dāng)前登錄的用戶。這里面就要說一下前端登錄和后端登錄的關(guān)系盾计。
后端登錄和前端是分開的售担,比如做第三方登錄的時(shí)候赁遗,第三方都需要一個(gè)回調(diào)地址,那么我們可以在這個(gè)回調(diào)的路由中處理accesstoken的驗(yàn)證族铆,然后(也必須)在后端完成登錄岩四。這個(gè)部分不能做在前端,因?yàn)轵?yàn)證accesstoken需要第三方的appid和secretid哥攘,secretid是不能夠暴露在前端的剖煌。
那么在后端調(diào)用了比如AV.User._logInWith()方法完成登錄之后,同樣可以用AV.User.current()取到用戶信息逝淹。
leancloud提供了session和cookie管理的中間件
app.use(AV.Cloud.CookieSession({ secret: 'xitusecretxxxx', maxAge: 3600000, fetchUser: false }));
引入這個(gè)中間件之后耕姊,當(dāng)后臺登錄,前端請求的頁面都會帶有一個(gè)cookie(截圖是未登錄狀態(tài))
cookie的默認(rèn)名是avos:sess
注意這個(gè)cookie是而且只能是httpOnly的创橄。
當(dāng)頁面發(fā)出HTTP請求到路由(以express代碼為例)
function adminIsLoggedIn(req, res, next) {
var user = req.AV.user;
if(!user)
return res.redirect('/');
var query = new AV.Query(AV.Role);
query.equalTo('users', user);
query.equalTo('name', "admin");
query.count().then(function(count){
if(count) {
return next();
}
else
{
return res.redirect('/');
}
}, function(error) {
return res.redirect('/');
});
}
app.get('/admin', adminIsLoggedIn, admin.home);
req.AV.user能夠得到當(dāng)前session中的user對象箩做,從而進(jìn)行身份驗(yàn)證。leancloud官方不建議在這里使用AV.User.Current()妥畏,因?yàn)檫@個(gè)函數(shù)使用了Domain邦邦。另外要注意的是,如果僅僅使用了前端登錄醉蚁,那么雖然在前端可以AV.User.Current()拿到user燃辖,但是req.AV.user依然是空的。
前端登錄就比較簡單了网棍,同樣調(diào)用登錄函數(shù)黔龟,leancloud會把個(gè)人信息放在localstorage里面
然后前端調(diào)用AV.User.current()就可以取到當(dāng)前的的用戶信息。
一般的應(yīng)用應(yīng)該使用后端登錄的方式滥玷,而如果是微信移動端或者是SPA的應(yīng)用氏身,可以考慮前端登錄方式。
OAuth2
既然前面說到了第三方登錄惑畴,順便說說OAuth2蛋欣。
一個(gè)比較通用的OAuth2過程如上圖所示,不同平臺的參數(shù)個(gè)數(shù)和參數(shù)名可能略有不同如贷,就把幾個(gè)重要的參數(shù)拿出來說明一下陷虎。
首先是請求授權(quán)頁面,需要第三方平臺的appid杠袱,回調(diào)地址要提前在第三方注冊尚猿,scope是請求的權(quán)限,state是可以在授權(quán)成功之后返回的參數(shù)楣富。
授權(quán)成功之后凿掂,返回授權(quán)頁面,可以通過傳入的state來決定不同的方式菩彬,比如多個(gè)平臺共用一個(gè)回調(diào)地址的時(shí)候缠劝,可以通過state參數(shù)來判斷code所屬平臺潮梯,然后調(diào)用對應(yīng)平臺的驗(yàn)證API。
通過code換取access_token這一步必須要在后臺完成惨恭,因?yàn)樯婕暗绞褂胊ppsecret秉馏,不能暴露在前端。
得到access_token之后脱羡,就可以為所欲為的拿用戶各種數(shù)據(jù)啦萝究。