在云代码中处理用户登录

使用云代码的 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 :

  
    
    
      

        Username
        
        Password
        
        
      

    
  

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

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

评论