Skip to content

Commit aec8a3d

Browse files
committed
Continuing Passport implementation in server and client-side
1 parent 88783bd commit aec8a3d

File tree

7 files changed

+227
-14
lines changed

7 files changed

+227
-14
lines changed

client/src/utils/requireAuth.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import React from 'react';
2+
import { connect } from 'react-redux';
3+
import PropTypes from 'prop-types';
4+
import {} from 'react-router-dom';
5+
//import { addFlashMessage } from '../actions/flashMessages';
6+
7+
/**
8+
* Protect Client-Side Routes with Higher Order Component
9+
* @return {[type]} [description]
10+
*/
11+
export default (ComposedComponent) => {
12+
class Authenticate extends React.Component {
13+
/**
14+
* Função chamada antes de iniciar o componente
15+
* Este recurso é um dos vários "life cycle hook" que o React provê para componentes
16+
*/
17+
componentWillMount() {
18+
// Se não está autenticado - Pega do state recebido do Redux mapeado para propriedade
19+
if (!this.props.isAuthenticated) {
20+
// Mensagem de acesso negado
21+
// this.props.addFlashMessage({
22+
// type: 'error',
23+
// text: 'You need to login to access this page'
24+
// });
25+
// Redireciona
26+
this.props.history.push('/login');
27+
}
28+
}
29+
30+
/**
31+
* Função chamada quando há alguma alteração nas propriedades do componente
32+
* Mais um "life cycle hook"
33+
*/
34+
componentWillUpdate(nextProps) {
35+
if (!nextProps.isAuthenticated) {
36+
this.props.history.push('/login');
37+
}
38+
}
39+
40+
render() {
41+
return (
42+
<ComposedComponent {...this.props} />
43+
);
44+
}
45+
}
46+
47+
Authenticate.propTypes = {
48+
isAuthenticated: PropTypes.bool.isRequired //,
49+
//addFlashMessage: PropTypes.func.isRequired,
50+
//history: PropTypes.object.isRequired
51+
}
52+
53+
// let mapStateToProps = (state) => {
54+
// return {
55+
// isAuthenticated: state.auth.isAuthenticated
56+
// }
57+
// }
58+
//
59+
// return connect(mapStateToProps, { addFlashMessage })(Authenticate);
60+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import axios from 'axios';
2+
3+
export default function setAuthorizationToken(token) {
4+
if (token) {
5+
// Write "Bearer" token in requests header
6+
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
7+
} else {
8+
// Remove authorization from header
9+
delete axios.defaults.headers.common['Authorization'];
10+
}
11+
}

server/index.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import passport from 'passport';
88
import bands from './routes/bands';
99
import albums from './routes/albums';
1010
import models from './models';
11-
import strategies from './middleware/passport.js';
11+
import strategies from './config/passport.js';
1212

1313
const app = express();
1414

@@ -30,7 +30,7 @@ app.use(bodyParser.urlencoded({ extended: true }));
3030
// Passport
3131
// Initialize passport, express + passport session and add them both as middleware.
3232
// We do this by adding these lines some spaces after the bodyParser import line.
33-
app.use(session({ secret: 'node and more node please!', resave: true, saveUninitialized: true })); // session secret
33+
app.use(session({ secret: 'node_and_more_node_please!', resave: true, saveUninitialized: true })); // session secret
3434
app.use(passport.initialize());
3535
app.use(passport.session()); // persistent login sessions
3636

@@ -62,12 +62,13 @@ else
6262

6363
module.exports = app;
6464

65-
// ------------------------------------------------------------------------------
66-
// NodeJS Environment > process.env.NODE_ENV
67-
// ------------------------------------------------------------------------------
68-
// To set an environment variable in Windows normally:
69-
// SET NODE_ENV=development
70-
// Through PowerShell terminal:
71-
// $env:NODE_ENV="development"
65+
// ------------------------------------------------------------------------------ //
66+
// Set NodeJS Environment ---> process.env.NODE_ENV
67+
// ------------------------------------------------------------------------------ //
68+
// Windows normally
69+
// > SET NODE_ENV=development
70+
// PowerShell terminal:
71+
// > $env:NODE_ENV="development"
7272
// If you are in OSX or Linux terminals:
73-
// export NODE_ENV=development
73+
// > export NODE_ENV=development
74+
// ------------------------------------------------------------------------------ //

server/middlewares/authenticate.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import jwt from 'jsonwebtoken';
2+
import models from '../models';
3+
4+
/**
5+
* Verifica se o usuário está autorizado (válido e logado)
6+
* @function
7+
* @param {Object} req Request (Requisição)
8+
* @param {Object} res Response (Resposta)
9+
* @param {Function} next Chama a próxima função da cadeia de execução
10+
*/
11+
export default (req, res, next) => {
12+
// Autorização presente no cabeçalho
13+
const authorizationHeader = req.headers['authorization'];
14+
// Variável reservada para armazenar o token "bruto"
15+
let token;
16+
17+
if (authorizationHeader)
18+
token = authorizationHeader.split(' ')[1]; // Parte após o "Bearer"
19+
20+
if (token) {
21+
// Verifica se o token é um dado válido
22+
jwt.verify(token, "node_and_more_node_please!", (err, decoded) => {
23+
if (err) {
24+
res.status(401).json({ error: 'Failed to authenticate' });
25+
} else {
26+
models.User
27+
.findById(decoded.id)
28+
.then(user => {
29+
req.currentUser = user;
30+
next();
31+
})
32+
.catch(err => res.status(404).json({ error: 'No such user' }));
33+
}
34+
});
35+
} else {
36+
res.status(403).json({ error: 'No token provided' });
37+
}
38+
}

server/package-lock.json

Lines changed: 106 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"dotenv": "^5.0.1",
2424
"express": "^4.16.3",
2525
"express-session": "^1.15.6",
26+
"jsonwebtoken": "^8.2.2",
2627
"lodash": "^4.17.10",
2728
"mocha": "^5.2.0",
2829
"morgan": "^1.9.0",

0 commit comments

Comments
 (0)