67 lines
1.4 KiB
JavaScript
67 lines
1.4 KiB
JavaScript
/**
|
||
*
|
||
* @authors yutent (yutent@doui.cc)
|
||
* @date 2018-07-26 15:50:25
|
||
* @version $Id$
|
||
*/
|
||
import redisStore from './lib/redis-store.js'
|
||
import nativeStore from './lib/native-store.js'
|
||
import { uuid, sha1 } from 'crypto.js'
|
||
|
||
export default function(req, res, next) {
|
||
var opt = this.get('session')
|
||
var jwt = this.get('jwt')
|
||
var cookie = this.ins('cookie')
|
||
var session = null
|
||
var deviceID = uuid()
|
||
var ssid = ''
|
||
|
||
opt.jwt = jwt
|
||
|
||
if (req.method === 'OPTIONS') {
|
||
return next()
|
||
}
|
||
|
||
if (jwt) {
|
||
var auth = req.header('authorization')
|
||
if (auth) {
|
||
ssid = auth.split('.').pop()
|
||
deviceID = auth
|
||
}
|
||
} else {
|
||
ssid = cookie('NODESSID')
|
||
// 校验级别为1, 则混入ua
|
||
if (opt.level > 0) {
|
||
deviceID += req.header('user-agent')
|
||
}
|
||
// 校验级别为2, 则混入ip
|
||
if (opt.level > 1) {
|
||
deviceID += req.ip()
|
||
}
|
||
}
|
||
deviceID = sha1(deviceID)
|
||
|
||
if (opt.type === 'redis') {
|
||
session = new redisStore(this.__SESSION_STORE__, opt, deviceID)
|
||
} else {
|
||
session = new nativeStore(this.__SESSION_STORE__, opt, deviceID)
|
||
}
|
||
|
||
// 启用SESSION
|
||
// ssid非法或过期时,需要重写
|
||
if (!ssid || ssid !== session.start(ssid)) {
|
||
ssid = session.start(ssid)
|
||
if (!jwt) {
|
||
cookie('NODESSID', ssid, {
|
||
httpOnly: true,
|
||
expires: opt.ttl,
|
||
domain: opt.domain
|
||
})
|
||
}
|
||
}
|
||
|
||
this.__INSTANCE__.session = session
|
||
|
||
next()
|
||
}
|