leancloud用户系统

对于nodejs开发者来说,可能会发现leancloud有两个给js使用的sdk:leanengine-node-sdkjavascript-sdk
前者的npm包名是leanengine,后者包名叫做avoscloud-sdk。
看一下leanengine的package.json可以发现


leanengine是依赖avoscloud-sdk的,leanengine除了能够使用avoscloud-sdk的全部功能以外,还有额外拓展的供nodejs使用的方法。

所以结论就是,如果是一个纯前端的项目,就引入avoscloud-sdk,而如果使用在nodejs服务器的话,则引入leanengine。之前有一个项目在(我猜是因为)前端使用了leanengine,会使chrome产生websocket连接的问题,而导致浏览器卡死。
用户

在leancloud新建的项目,会有6个默认的Class,这篇文章会说到其中的_User

_User表的字段如下:


其中username和password是必填字段,而且username是一个要求唯一的字段。email和mobilePhoneNumber则是选填字段。

authData用来保存第三方登录信息,也是本文后面重点要说的部分。

emailVerified和mobilePhoneVerified是布尔型,用来标注邮箱和手机是否验证。顺便一提,邮箱验证和手机验证服务已经集成在leancloud内了,不需要使用额外的邮件或短信服务商,而且验证后直接更新数据库,完全没有开发的成本。

sessionToken字段是记录用户会话的,在avoscloud-sdk 0.5.1版本中,加入了AV.User.become方法,可以使用sessionToken直接登录。

注册 AV.User.signUp()

LeanCloud 文档
标注的注册方法需要用户名和密码,其他信息可以随注册信息一起提供,或者在signUp的回调中再次更新。

登录 AV.User.logIn()

LeanCloud 文档
leancloud的标准登录方法除了支持username和password登录,同时支持email和password登录。这也就是说,邮箱登陆的功能也不需要额外开发了,可以直接在登录框位置注明:“用户名/邮箱” 然后无论用户输入的是username还是email,都可以用logIn方法登入。

如果要使用手机登录,则要调用AV.User.logInWithMobilePhone()方法,另一种手机登录方式是通过手机号和验证短信直接登入的AV.User.requestSmsCode(),如果使用这个方法注册的话,新用户的username默认为手机号码。

绑定第三方

LeanCloud 文档**
AV.User._logInWith()方法提供了第三方绑定的方法。这个方法会创建一个新的用户,username为随机串。

绑定微博的代码是:

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会在登录时验证access_token的可靠性,其他第三方平台要自行通过平台的方法去验证。
如果已经有一个leancloud账号,想要绑定第三方,可以使用_linkWith方法

var user = ...已存在的处于登录状态的 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不会验证这个第三方账号是不是已经被其他用户绑定,如果同一个微博账号多次绑定用户,代码执行的时候不会报错,在登录的时候,会登入最后一个绑定的账号。

当前用户

通过AV.User.current()方法可以得到当前登录的用户。这里面就要说一下前端登录和后端登录的关系。

后端登录和前端是分开的,比如做第三方登录的时候,第三方都需要一个回调地址,那么我们可以在这个回调的路由中处理accesstoken的验证,然后(也必须)在后端完成登录。这个部分不能做在前端,因为验证accesstoken需要第三方的appid和secretid,secretid是不能够暴露在前端的。

那么在后端调用了比如AV.User._logInWith()方法完成登录之后,同样可以用AV.User.current()取到用户信息。

leancloud提供了session和cookie管理的中间件

app.use(AV.Cloud.CookieSession({ secret: 'xitusecretxxxx', maxAge: 3600000, fetchUser: false }));
引入这个中间件之后,当后台登录,前端请求的页面都会带有一个cookie(截图是未登录状态)

cookie的默认名是avos:sess
注意这个cookie是而且只能是httpOnly的。
当页面发出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能够得到当前session中的user对象,从而进行身份验证。leancloud官方不建议在这里使用AV.User.Current(),因为这个函数使用了Domain。另外要注意的是,如果仅仅使用了前端登录,那么虽然在前端可以AV.User.Current()拿到user,但是req.AV.user依然是空的。

前端登录就比较简单了,同样调用登录函数,leancloud会把个人信息放在localstorage里面


然后前端调用AV.User.current()就可以取到当前的的用户信息。

一般的应用应该使用后端登录的方式,而如果是微信移动端或者是SPA的应用,可以考虑前端登录方式。

OAuth2

既然前面说到了第三方登录,顺便说说OAuth2。

一个比较通用的OAuth2过程如上图所示,不同平台的参数个数和参数名可能略有不同,就把几个重要的参数拿出来说明一下。

首先是请求授权页面,需要第三方平台的appid,回调地址要提前在第三方注册,scope是请求的权限,state是可以在授权成功之后返回的参数。

授权成功之后,返回授权页面,可以通过传入的state来决定不同的方式,比如多个平台共用一个回调地址的时候,可以通过state参数来判断code所属平台,然后调用对应平台的验证API。

通过code换取access_token这一步必须要在后台完成,因为涉及到使用appsecret,不能暴露在前端。
得到access_token之后,就可以为所欲为的拿用户各种数据啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,589评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,106评论 18 139
  • REST API 可以让你用任何支持发送 HTTP 请求的设备来与 Parse 进行交互,你可以使用 REST A...
    Caroline嗯哼阅读 1,939评论 0 0
  • 守卫懒洋洋的打了个哈欠,眼皮越来越重,倚着枪睡着了。 瞌睡虫是仙虫,能让普通法力的仙人睡上两个时辰。天上一日,相当...
    柳汀雪阅读 297评论 0 1
  • 时值寒冬,郊外是一片荒岭。这山上也没有梅花,自然也不会有踏雪寻梅的风雅。风瑟瑟地吹着,直刺心骨;湖面都结了...
    寒江三月阅读 199评论 0 0