Skip to content

Commit

Permalink
Merge pull request #172 from Mong-Gu/feature/auth
Browse files Browse the repository at this point in the history
회원가입 기능 리팩토링, jwt 관련 로직 수정 및 리팩토링
  • Loading branch information
bbbyung2 authored Dec 4, 2020
2 parents b63677a + 8343d92 commit 4a5385b
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 21 deletions.
23 changes: 20 additions & 3 deletions server/src/api/controllers/oauth.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,40 @@ const redirectToOauthLoginPage = async (ctx) => {

const login = async (ctx) => {
try {
const { code, state } = ctx.request.query;
// eslint-disable-next-line camelcase
const { code, state, err, error_description } = ctx.request.query;
if (err) {
throw new Error(error_description);
}

const { provider } = ctx.params;
const config = getConfig(provider);
const oauthUser = await oauthService.getUserInfo(code, state, config);
const ourServiceUser = await oauthService.findOrCreateUser(oauthUser);
const jwtToken = generateToken(ourServiceUser.toJSON());
const jwtToken = await generateToken(ourServiceUser);
ctx.cookies.set('jwt', jwtToken, {
httpOnly: true,
maxAge: jwtConfig.cookieExpiresIn,
});
ctx.body = { ourServiceUser, jwtToken };
ctx.state.user = ourServiceUser;
ctx.body = ourServiceUser;
console.log(ourServiceUser);
console.log(jwtToken);
} catch (e) {
ctx.throw(500, e);
}
};

const logout = async (ctx) => {
try {
const { provider } = ctx.params;
} catch (err) {
ctx.throw(500, err);
}
};

module.exports = {
login,
logout,
redirectToOauthLoginPage,
};
1 change: 1 addition & 0 deletions server/src/api/controllers/transaction.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const transactionService = require('@services/transaction');

const findTransactions = async (ctx) => {
// eslint-disable-next-line camelcase
const { start_date, end_date, accountbook_id } = ctx.request.query;
const incomes = await transactionService.findIncomes(accountbook_id, start_date, end_date);
const expenditures = await transactionService.findExpenditures(accountbook_id, start_date, end_date);
Expand Down
7 changes: 4 additions & 3 deletions server/src/api/middlewares/jwt-authentication.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ module.exports = async (ctx, next) => {
if (!token) {
throw new Error('jwt토큰 없음');
}
const decodedToken = decodeToken(token);
if (Date.now() / 1000 - decodedToken.iat > 60 * 60 * 2) {
const newToken = generateToken(decodedToken);
const [user, decoded] = await decodeToken(token);
if (Date.now() / 1000 - decoded.iat > 60 * 60 * 2) {
const newToken = generateToken(decoded);
ctx.cookies.set('jwt', newToken, {
httpOnly: true,
maxAge: jwtConfig.cookieExpiresIn,
});
}
ctx.state.user = user;
} catch (err) {
ctx.throw(401, err);
}
Expand Down
5 changes: 5 additions & 0 deletions server/src/db/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ module.exports = (sequelize, DataTypes) => {
type: DataTypes.STRING(500),
allowNull: true,
},
token: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
},
},
{
tableName: 'user',
Expand Down
4 changes: 4 additions & 0 deletions server/src/db/seeders/2020120210-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module.exports = {
email: '[email protected]',
nickname: 'lacomaco122',
profile_url: 'https://i.imgur.com/0kGli9o.jpg',
token: null,
created_at: '2020-11-23',
updated_at: '2020-11-23',
},
Expand All @@ -16,6 +17,7 @@ module.exports = {
email: '[email protected]',
nickname: 'dbsgusdn34',
profile_url: 'http://k.kakaocdn.net/dn/bVj1JP/btqNf61kIPC/HNvrQA2X1Cylb17MxtPVm1/img_640x640.jpg',
token: null,
created_at: '2020-11-24',
updated_at: '2020-11-24',
},
Expand All @@ -25,6 +27,7 @@ module.exports = {
email: '[email protected]',
nickname: 'bhko0524',
profile_url: 'https://ssl.pstatic.net/static/pwe/address/img_profile.png',
token: null,
created_at: '2020-11-25',
updated_at: '2020-11-25',
},
Expand All @@ -34,6 +37,7 @@ module.exports = {
email: '[email protected]',
nickname: 'mu1616',
profile_url: 'https://ssl.pstatic.net/static/pwe/address/img_profile.png',
token: null,
created_at: '2020-11-26',
updated_at: '2020-11-26',
},
Expand Down
21 changes: 19 additions & 2 deletions server/src/services/oauth.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,32 @@ const getUserInfo = async (code, state, config) => {
};

const findOrCreateUser = async (oauthUser) => {
const [user] = await db.user.findOrCreate({
const [ourServiceUser, isNew] = await db.user.findOrCreate({
where: {
provider: oauthUser.provider,
email: oauthUser.email,
},
defaults: {
provider: oauthUser.provider,
email: oauthUser.email,
nickname: oauthUser.nickname,
profileUrl: oauthUser.profileUrl,
},
});
return user;
if (!isNew) {
if (ourServiceUser.profileUrl !== oauthUser.profileUrl) {
await db.user.update({ profileUrl: oauthUser.profileUrl }, { where: { id: ourServiceUser.id } });
}
}

const ourServiceUserInfo = {
id: ourServiceUser.id,
provider: ourServiceUser.provider,
nickname: ourServiceUser.nickname,
profileUrl: ourServiceUser.profileUrl,
};

return ourServiceUserInfo;
};

module.exports = {
Expand Down
44 changes: 31 additions & 13 deletions server/src/utils/jwt-utils.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,43 @@
const jwt = require('jsonwebtoken');

const jwtConfig = require('@config/jwt');
const db = require('@models');

const generateToken = (user) => {
const jwtToken = jwt.sign(
const generateToken = async (user) => {
const jwtToken = jwt.sign({ iss: 'moa', userId: user.id }, jwtConfig.jwtSecretKey, {
expiresIn: jwtConfig.jwtExpiresIn,
});
await db.user.update(
{ token: jwtToken },
{
iss: 'moa',
userId: user.id,
provider: user.provider,
email: user.email,
nickname: user.email.match(/^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@/g)[0].replace('@', ''),
profileUrl: user.profileUrl,
where: {
id: user.id,
},
},
jwtConfig.jwtSecretKey,
{ expiresIn: jwtConfig.jwtExpiresIn },
);
return jwtToken;
};

const decodeToken = (token) => {
const decodedToken = jwt.verify(token, jwtConfig.jwtSecretKey);
return decodedToken;
const decodeToken = async (token) => {
const decodedToken = jwt.verify(token, jwtConfig.jwtSecretKey, (err, decoded) => {
if (err) {
throw new Error('jwt secret이 잘못되었음');
}
return decoded;
});
let user = await db.user.findOne({
where: { id: decodedToken.userId },
attributes: ['id', 'provider', 'nickname', 'profileUrl', 'token'],
});
if (!user) {
throw new Error('decoded payload에 기재된 유저가 없음');
}
if (user.token !== token) {
throw new Error('decoded payload에 기재된 유저는 있지만, 서버에서 발행해준 jwt값과 일치하지 않음');
}
user = user.toJSON();
delete user.token;
return [user, decodedToken];
};

module.exports = {
Expand Down

0 comments on commit 4a5385b

Please sign in to comment.