diff --git a/src/index.ts b/src/index.ts index e880caa51515ba7eca2a69fe1f83c570176280a9..f26f67e492a27ba99a225895c19e6a6b7faa0c30 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,13 +3,14 @@ import express, { Request, Response, NextFunction, Application } from "express"; import bodyParser from "body-parser"; import expressSession from "express-session"; import authRoute from './routes/auth'; +import userRoute from './routes/user'; const app: Application = express(); app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded app.use(expressSession({ - secret: process.env.SESSION_SECRET || "alma", + secret: process.env.SESSION_SECRET || "secret", resave: false, saveUninitialized: true, cookie: { secure: false } @@ -18,7 +19,7 @@ app.use(expressSession({ app.get("/", (req: Request, res: Response) => { let message = "World!"; if(req.session!.user) - message = req.session!.user!.sn || "World!"; + message = req.session!.user!.name || "World!"; res.send( "Hello " + message) }); diff --git a/src/middlewares/auth/authenticated.ts b/src/middlewares/auth/authenticated.ts index d5f7ea0e9fe2bdecbd23a16f6c7fb3188e57cbf6..139a50d949d0b81a8c0f4ca2d5b5f3fbfbb4fb67 100644 --- a/src/middlewares/auth/authenticated.ts +++ b/src/middlewares/auth/authenticated.ts @@ -1,12 +1,12 @@ -import {Request, Response, NextFunction} from "express"; - -const authenticated = () => (req : Request, res : Response, next: NextFunction ) =>{ - if(req.session!.user) - next(); - else{ - res.status(403); - res.json({message: "You have to login to see this page"}); - } -} - +import {Request, Response, NextFunction} from "express"; + +const authenticated = () => (req : Request, res : Response, next: NextFunction ) =>{ + if(req.session!.user) + next(); + else{ + res.status(403); + res.json({message: "You have to login to see this page"}); + } +} + export default authenticated; \ No newline at end of file diff --git a/src/middlewares/auth/complete.ts b/src/middlewares/auth/complete.ts index dedc5c8c0d95f6611bc2731264f4e851c15128dd..2f51c83720611deeaed408fdcf3c4abd7f1a7d74 100644 --- a/src/middlewares/auth/complete.ts +++ b/src/middlewares/auth/complete.ts @@ -1,29 +1,33 @@ -import { Request, Response } from 'express'; -import {oauth2, scope} from '../../utils/auth' -import axios from "axios"; - - -const complete = () => async (req: Request, res: Response) => { - const tokenConfig = { - code: req.query.code, - scope: scope, - redirect_uri: "" - }; - - try { - const result = await oauth2().authorizationCode.getToken(tokenConfig); - const token = oauth2().accessToken.create(result); - await axios.get(`https://auth.sch.bme.hu/api/profile/?access_token=${token.token.access_token}`) - .then( (response) => { - req.session!.user = response.data; - }) - .catch(function (error) { - console.log(error); - }); - res.redirect('/'); - } catch (error) { - console.log('Access Token Error', error.message); - } -}; - +import { Request, Response } from 'express'; +import {oauth2, scope} from '../../utils/auth' +import axios from "axios"; + + +const complete = () => async (req: Request, res: Response) => { + const tokenConfig = { + code: req.query.code, + scope: scope, + redirect_uri: "" + }; + + try { + const token = await oauth2().authorizationCode.getToken(tokenConfig); + await axios.get(`https://auth.sch.bme.hu/api/profile/?access_token=${token.access_token}`) + .then( (response) => { + req.session!.user = { + id: String(response.data.basic), + email: String(response.data.mail), + name: `${response.data.sn} ${response.data.givenName}` , + token, + }; + }) + .catch(function (error) { + console.log(error); + }); + res.redirect('/'); + } catch (error) { + console.log('Access Token Error', error.message); + } +}; + export default complete; \ No newline at end of file diff --git a/src/middlewares/auth/login.ts b/src/middlewares/auth/login.ts index 356629f10a2f8bda13639201a837cdf7416b6fcd..a1efd4d702106c65512c6b87c4734fcfd9ec279d 100644 --- a/src/middlewares/auth/login.ts +++ b/src/middlewares/auth/login.ts @@ -1,13 +1,13 @@ -import { Request, Response } from 'express'; -import {oauth2, scope} from '../../utils/auth' - - -const authorizationUri = oauth2().authorizationCode.authorizeURL({ - scope: scope, -}); - - -const login = () => (req: Request, res: Response) => res.redirect(authorizationUri); - - +import { Request, Response } from 'express'; +import {oauth2, scope} from '../../utils/auth' + + +const authorizationUri = oauth2().authorizationCode.authorizeURL({ + scope: scope, +}); + + +const login = () => (req: Request, res: Response) => res.redirect(authorizationUri); + + export default login; \ No newline at end of file diff --git a/src/middlewares/auth/logout.ts b/src/middlewares/auth/logout.ts index 791772f76771a64ddd2b04952bdeaa7f65afabda..9367d85fe4d7d7c23604fc1f62ff5f05aa2c5e84 100644 --- a/src/middlewares/auth/logout.ts +++ b/src/middlewares/auth/logout.ts @@ -1,8 +1,8 @@ -import { Request, Response } from 'express'; - -const logout = () => (req : Request, res : Response) =>{ - req.session!.destroy(() => console.log("user logged out.")); - res.redirect("/"); -} - +import { Request, Response } from 'express'; + +const logout = () => (req : Request, res : Response) =>{ + req.session!.destroy(() => console.log("user logged out.")); + res.redirect("/"); +} + export default logout; \ No newline at end of file diff --git a/src/middlewares/auth/refreshToken.ts b/src/middlewares/auth/refreshToken.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d857bb151626e418365d095e4e667ec4a183450 --- /dev/null +++ b/src/middlewares/auth/refreshToken.ts @@ -0,0 +1,18 @@ +import { Request, Response, NextFunction } from 'express'; +import { oauth2 } from '../../utils/auth' + +const refreshToken = () => async (req: Request, res: Response, next: NextFunction) => { + if (req.session && req.session.user) { + try{ + let accessToken = oauth2().accessToken.create(req.session.user.token); + if (accessToken.expired(Number(process.env.AUTH_TOKEN_EXPIRATION_WINDOW_IN_SECONDS))) { + req.session.user.token = await accessToken.refresh().then(accessToken => accessToken.token); + } + }catch (error) { + console.log('Error refreshing access token: ', error.message); + } + } + next(); +} + +export default refreshToken; \ No newline at end of file diff --git a/src/models/.gitkeep b/src/models/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/models/user.interface.ts b/src/models/user.interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..50df6043ba1d9fc5ff826c56db1797b6c21b4014 --- /dev/null +++ b/src/models/user.interface.ts @@ -0,0 +1,8 @@ +import { Token } from "simple-oauth2"; + +export interface User{ + email: string, + name: string, + id: string, + token: Token, +} \ No newline at end of file diff --git a/src/routes/auth.ts b/src/routes/auth.ts index b930250fa6704fd6b43c0f1191e7ff25326c00e6..a11e4dcb83c1338fe4396532708717ec36c83013 100644 --- a/src/routes/auth.ts +++ b/src/routes/auth.ts @@ -2,9 +2,9 @@ import { Application } from 'express'; import login from '../middlewares/auth/login'; import complete from '../middlewares/auth/complete'; import logout from '../middlewares/auth/logout'; -import authenticated from '../middlewares/auth/authenticated' +import authenticated from '../middlewares/auth/authenticated'; - const authRout = (app: Application): void => { + const authRoute = (app: Application): void => { app.get('/login', login() ); app.get('/complete', complete() ); @@ -12,4 +12,4 @@ import authenticated from '../middlewares/auth/authenticated' app.get('/logout', authenticated(), logout() ); } -export default authRout; \ No newline at end of file +export default authRoute; \ No newline at end of file diff --git a/src/utils/.gitkeep b/src/utils/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/utils/declarations/session.d.ts b/src/utils/declarations/session.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..70023005e094f05efb4eee9ec4d5775e0473f4b1 --- /dev/null +++ b/src/utils/declarations/session.d.ts @@ -0,0 +1,10 @@ +import { AccessToken } from "simple-oauth2"; +import { User } from 'src/models/user.interface'; + +declare global { + namespace Express { + export interface Session { + user: User | null; + } + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f745dd84918902c132c5a381abacc49ca0042b08..fe19797508bb8cee6a58c85b0a8024c493e9da63 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,8 @@ { + "files": [ + "./src/utils/declarations/session.d.ts" + ], + "compilerOptions": { "module": "commonjs", "strict": true,