在云代码中处理用户登录

使用云代码的 web hosting 功能,你可以在我们的云代码里托管一个网站。网站很经常需要处理的一个事情是用户登录和登出。

今天我们来介绍下怎么在云代码里的 web 主机里,使用 express.js 框架处理用户登录和登出。

首先,您需要安装最新版本的 avoscloud-code 命令行工具(必须升级到最新的 0.3.3-beta 版本):

sudo npm install -g avoscloud-code

关于命令行更多详细内容请参考这篇 博客

接下来,假设你创建了一个支持 web 主机功能的云代码项目,在 app.js 里添加下列代码:

var express = require('express');
var app = express();
var avosExpressCookieSession = require('avos-express-cookie-session');

// App 全局配置
app.set('views', 'cloud/views');   //设置模板目录
app.set('view engine', 'ejs');    // 设置 template 引擎
app.use(express.bodyParser());    // 读取请求 body 的中间件

//启用 cookie
app.use(express.cookieParser('Your Cookie Secure'));  
//使用 avos-express-cookie-session 记录登录信息到 cookie。
app.use(avosExpressCookieSession({ cookie: { maxAge: 3600000 }})); 

使用 express.cookieParser 中间件启用 cookie,注意传入一个 secret 用于 cookie 加密(必须)。然后使用 require('avos-express-cookie-session') 导入的 avosExpressCookieSession 创建一个 session 存储,它会自动将 AV.User 的登录信息记录到 cookie 里,用户每次访问会自动检查用户是否已经登录,如果已经登录,可以通过 AV.User.current() 获取当前登录用户。

avos-express-cookie-session' 支持的选项包括:

  • cookie 可选参数,设置 cookie 属性,例如 maxAge,secure 等。我们会强制将 httpOnly 和 signed 设置为 true。
  • fetchUser 是否自动 fetch 当前登录的 AV.User 对象。默认为 false。如果设置为 true,每个 HTTP 请求都将发起一次 AVOS Cloud API 调用来 fetch 用户对象。如果设置为 false,默认只可以访问 AV.User.current() 当前用户的 id 属性,您可以在必要的时候 fetch 整个用户。通常保持默认的 false 就可以。
  • key session 在 cookie 中存储的 key 名称,默认为 avos.sess

登录很简单:

app.get('/login', function(req, res) {
    // 渲染登录页面
    res.render('login.ejs');
});
// 点击登录页面的提交将出发下列函数
app.post('/login';, function(req, res) {
    AV.User.logIn(req.body.username, req.body.password).then(function() {
        //登录成功,avosExpressCookieSession 会自动将登录用户信息存储到 cookie
        //跳转到 profile 页面。
        console.log('signed in successfully: %j', AV.User.current());
        res.redirect('/profile');
    },function(error) {
        //登录失败,跳转到登录页面
        res.redirect('/login');
    });
});

//查看用户 profile 信息
app.get('/profile', function(req, res) {
    // 判断用户是否已经登录
    if (AV.User.current()) {
        // 如果已经登录,发送当前登录用户信息。
        res.send(AV.User.current());
    } else {
        // 没有登录,跳转到登录页面。
        res.redirect('/login');
    }
});

//调用此 url 来登出帐号
app.get('/logout', function(req, res) {
    //avosExpressCookieSession 将自动清除登录 cookie 信息
    AV.User.logOut();
    res.redirect('/profile');
});

登录页面大概是这样 login.ejs:

  
    
    
      
%MINIFYHTML0845e38673606b13ece814c77bb88c961%

P.S. 本次除了命令行工具做了升级之外,我们的 avoscloud-sdk 也升级到了 0.2.8,解决在 node.js 环境下用户登录信息会保存在本地文件的 Bug。

注意 :express 框架的 express.session.MemoryStore 在我们云代码中是无法正常工作的,因为我们的云代码是多主机,多进程运行,因此内存型 session 是无法共享的,建议用 cookieSession 中间件。