openstf探索(二)—— 登录代码解读

好记性不如烂,看了几天stf的源码,记录总结一下。

首先说下stf的启动

启动命令是:stf local, 在终端输入该命令,项目就启动起来了。  stf是该项目设置的一个命令,就好像npm一样。在终端输入:stf  --help 就可以看到都有哪些命令

openstf探索(二)—— 登录代码解读_第1张图片

/bin 是项目的启动文件,查看文件内容,最终我们定位到了lib/cli/index.js。然后,不知道在哪里配置的,或者是什么机制,通过local命令,我们启动项目使用的配置参数用的是lib/cli/local/index.js中配置的参数。

stf有多种登录方式,通过stf local命令,启动的是mock 方式,这个在lib/cli/local/index.js有写,如下图所示

我们在启动的时候,我们可以修改这里的默认的登录方式,或者在启动时通过命令修改,采用ldap方式登录,启动时输入:stf local --auth-type ldap 即可

登录时代码流转过程

/lib 是后端代码

项目启动后(我们采用stf local命令启动,登录方式是默认的mock方式),在浏览器中输入http://localhost:7100 ,传到服务器,如果还未登录,就会被后端的拦截器拦住。在lib/cli/auth/mock.js中79行可以找到如下代码,登录后就会被路径为“/”的路由器拦截,然后重定向到路径为“/auth/mock/”的路由器,然后返回index页面。

  app.get('/', function(req, res) {
    res.redirect('/auth/mock/')
  })

  app.get('/auth/mock/', function(req, res) {
    res.render('index')
  })

然后就是前端的代码了 /res 是前端web的代码

不知道什么规则,然后返回的前端页面应该就是/res/auth/mock模块了,指的应该是/views了,我们看里面的代码

首先是/views/index.pug 里面的ng-app = “app”指令定义了一个名为app的angularJS应用程序,然后是/mock/scripts/entry.js文件,在文件中

 angular.module('app', [
    'ngRoute',
    'ngTouch',
    require('gettext').name,
    require('./signin').name
  ])

为app模块引入了别的文件,其中就包括/signin下的所有文件,我们再回到/views/index.pug文件,第9行代码,div(ng-view),ng-view命令的意思就是把/mock/scripts/signin/signin.pug文件内容放到这个div中。在登录页面点击提交时,就触发了SignInCtrl中的submit方法,代码中访问了/auth/api/v1/mock后端方法,然后就被拦截器拦截

app.post('/auth/api/v1/mock', function(req, res) {
    var log = logger.createLogger('auth-mock')
    log.setLocalIdentifier(req.ip)
    switch (req.accepts(['json'])) {
      case 'json':
        requtil.validate(req, function() {
            req.checkBody('name').notEmpty()
            req.checkBody('email').isEmail()
          })
          .then(function() {
            log.info('Authenticated "%s"', req.body.email)
            var token = jwtutil.encode({
              payload: {
                email: req.body.email
              , name: req.body.name
              }
            , secret: options.secret
            , header: {
                exp: Date.now() + 24 * 3600
              }
            })
            res.status(200)
              .json({
                success: true
              , redirect: urlutil.addParams(options.appUrl, {
                  jwt: token
                })
              })
          })
          .catch(requtil.ValidationError, function(err) {
            res.status(400)
              .json({
                success: false
              , error: 'ValidationError'
              , validationErrors: err.errors
              })
          })
          .catch(function(err) {
            log.error('Unexpected error', err.stack)
            res.status(500)
              .json({
                success: false
              , error: 'ServerError'
              })
          })
        break
      default:
        res.send(406)
        break
    }
  })

如果验证通过就进入stf中了 

 

你可能感兴趣的:(测试,stf)