Skip to content

Instantly share code, notes, and snippets.

@totuworld
Last active December 23, 2016 23:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save totuworld/72ffa52a423d192023514081880b593a to your computer and use it in GitHub Desktop.
Save totuworld/72ffa52a423d192023514081880b593a to your computer and use it in GitHub Desktop.
이세계에 진입한 서버 개발 3강 자료
'use strict'
const debug = require('debug')('Wendy:utils:auth');
const jwt = require('jsonwebtoken');
///!!!반드시 외부에 노출되는 코드에는 secret을 직접 적지 않아야한다!!!
const SECRET = process.env.AuthSECRET || "secret";
const EXPIRES = 3600; // 1 hour
// JWT 토큰 생성 함수
function signToken(body) {
return jwt.sign(body, SECRET, { expiresIn: EXPIRES });
}
exports.signToken = signToken;
exports.decodeToken = (token) =>{
let decode = jwt.decode(token);
return decode;
}
/**
* JWT 토큰을 검증할 때 사용된다.
*/
exports.isAuthenticated = (req, res, next) =>{
debug('isAuthenticated');
jwt.verify(req.headers.authorization, SECRET, (err, decoded)=>{
if(err) {
// IF A USER ISN'T LOGGED IN, THEN REDIRECT THEM SOMEWHERE
res.status(401).send('The request has not been applied because it lacks valid authentication credentials for the target resource.')
}
else {
// Attach user to request
// request에 user정보를 포함하여 전송한다.
req.user = {
GameUserID:decoded.GameUserID,
GameDeviceUID:decoded.GameDeviceUID
};
return next();
}
});
}
'use strict'
/**
* object에 key가 포함되어있는지 체크한다
* @param obj {object}
* @param keyArr {Array}
* @returns {boolean}
*/
exports.ObjectExistThatKeys = (obj, keyArr)=>{
for(let key of keyArr) {
if(obj[key]===null || obj[key]===undefined) {
return false;
}
}
return true;
}
'use strict'
class CustomError extends Error {
constructor(message, code) {
super(message);
this.name = this.constructor.name;
this.code = code;
this.message = message;
if (typeof Error.captureStackTrace === 'function') {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = (new Error(message)).stack;
}
}
}
/** 99101 */
class DontHaveRequiredParams extends CustomError {
constructor() {
let message = 'req.body에 필요한 값이 빠졌다.';
let code = 99101;
super(message, code);
}
}
/** 80101 */
class UnregisteredDevice extends CustomError {
constructor() {
let message = '등록하지 않은 기기';
let code = 80101;
super(message, code);
}
}
/** 80103 */
class UsedOnOtherDevice extends CustomError {
constructor() {
let message = '다른기기에서 사용중인 아이디';
let code = 80103;
super(message, code);
}
}
/** 80202 */
class CreateID extends CustomError {
constructor() {
let message = '등록된 기기이나 아이디가 생성되지않았다.';
let code = 80202;
super(message, code);
}
}
/** 80203 */
class UsedNickName extends CustomError {
constructor() {
let message = '이미 사용중인 NickName';
let code = 80203;
super(message, code);
}
}
/** 80204 */
class NickNameToLongOrShot extends CustomError {
constructor() {
let message = '3글자보다 짧거나 12글자 이상인 NickName';
let code = 80204;
super(message, code);
}
}
let errorMap = {
"DontHaveRequiredParams":DontHaveRequiredParams,
"UnregisteredDevice":UnregisteredDevice,
"UsedOnOtherDevice":UsedOnOtherDevice,
"CreateID":CreateID,
"UsedNickName":UsedNickName,
"NickNameToLongOrShot":NickNameToLongOrShot
}
module.exports = function(errorName) {
let error = new errorMap[errorName];
return error;
}
'use strict';
module.exports = function(sequelize, DataTypes) {
let GameDevice= sequelize.define('GameDevice', {
GameDeviceUID : { type : DataTypes.INTEGER, primaryKey: true, autoIncrement: true},
UUID:{type:DataTypes.STRING(60)},
DeviceType:{type:DataTypes.INTEGER, defaultValue:0},
MainFlag : { type : DataTypes.BOOLEAN, defaultValue:true }
}, {
timestamps: false,
tableName: 'GameDevice',
classMethods: {
associate: function (models) {
GameDevice.belongsTo(models.GameUser, {
onDelete: "CASCADE",
foreignKey: {
name:'GameUserID',
allowNull: true
}
});
}
}
});
return GameDevice;
};
'use strict';
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
let GameUser = sequelize.define('GameUser', {
GameUserID : { type : DataTypes.INTEGER, primaryKey: true, autoIncrement: true},
NickName : { type : DataTypes.STRING(32) },
Locale : { type : DataTypes.STRING(6)},
OffsetTime : { type :DataTypes.INTEGER, defaultValue: 0},
OffsetTimeUpdateAt : { type : DataTypes.DATE, defaultValue: Sequelize.NOW},
createAt : { type : DataTypes.DATE, defaultValue: Sequelize.NOW},
loginAt : { type : DataTypes.DATE, defaultValue: Sequelize.NOW}
}, {
timestamps: false,
tableName: 'GameUser'
});
return GameUser;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment