leancloud用戶系統(tǒng)

對于nodejs開發(fā)者來說,可能會發(fā)現(xiàn)leancloud有兩個(gè)給js使用的sdk:leanengine-node-sdkjavascript-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ù)啦萝究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锉罐,隨后出現(xiàn)的幾起案子帆竹,更是在濱河造成了極大的恐慌,老刑警劉巖脓规,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栽连,死亡現(xiàn)場離奇詭異,居然都是意外死亡侨舆,警方通過查閱死者的電腦和手機(jī)秒紧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挨下,“玉大人熔恢,你說我怎么就攤上這事〕舭剩” “怎么了叙淌?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長愁铺。 經(jīng)常有香客問我鹰霍,道長,這世上最難降的妖魔是什么茵乱? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任衅谷,我火速辦了婚禮,結(jié)果婚禮上似将,老公的妹妹穿的比我還像新娘。我一直安慰自己蚀苛,他們只是感情好在验,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堵未,像睡著了一般腋舌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渗蟹,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天块饺,我揣著相機(jī)與錄音赞辩,去河邊找鬼。 笑死授艰,一個(gè)胖子當(dāng)著我的面吹牛辨嗽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淮腾,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼糟需,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谷朝?” 一聲冷哼從身側(cè)響起洲押,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圆凰,沒想到半個(gè)月后杈帐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡专钉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年挑童,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶沼。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炮沐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回怜,到底是詐尸還是另有隱情大年,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布玉雾,位于F島的核電站翔试,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏复旬。R本人自食惡果不足惜垦缅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驹碍。 院中可真熱鬧壁涎,春花似錦、人聲如沸志秃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浮还。三九已至竟坛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背担汤。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工涎跨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崭歧。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓隅很,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驾荣。 傳聞我的和親對象是個(gè)殘疾皇子外构,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)播掷,斷路器审编,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • REST API 可以讓你用任何支持發(fā)送 HTTP 請求的設(shè)備來與 Parse 進(jìn)行交互,你可以使用 REST A...
    Caroline嗯哼閱讀 1,992評論 0 0
  • 守衛(wèi)懶洋洋的打了個(gè)哈欠歧匈,眼皮越來越重垒酬,倚著槍睡著了。 瞌睡蟲是仙蟲件炉,能讓普通法力的仙人睡上兩個(gè)時(shí)辰勘究。天上一日,相當(dāng)...
    柳汀雪閱讀 318評論 0 1
  • 時(shí)值寒冬斟冕,郊外是一片荒嶺口糕。這山上也沒有梅花,自然也不會有踏雪尋梅的風(fēng)雅磕蛇。風(fēng)瑟瑟地吹著景描,直刺心骨;湖面都結(jié)了...
    寒江三月閱讀 206評論 0 0