Skip to content

Commit 0bbe590

Browse files
authored
Merge pull request #523 from Lemoncode/feature/xiii_edition_update_oauth2
XIII Edition - OAuth2 update
2 parents 586f945 + d3e23e5 commit 0bbe590

29 files changed

+805
-62
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
NODE_ENV=development
2+
PORT=3000
3+
GOOGLE_CLIENT_ID=
4+
GOOGLE_CLIENT_SECRET=

06-rest-api/05-oauth/02-cookie-and-jwt/README_es.md

Lines changed: 50 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,7 @@ Si arrancamos el proyecto:
1818
npm start
1919
```
2020

21-
**Ojo primero hay que hacer setup del .env (ya listo)**
22-
23-
Podemos ver que hay dos endpoints interesantes:
24-
25-
http://localhost:3000
26-
27-
http://localhost:3000/api
28-
29-
En uno se muestra una página, en la otra tenemos un endpoint que devuelve json
30-
31-
Vamos a arrancar por instalar las dependencias que necesitamos:
32-
33-
En este caso:
34-
35-
- Vamos a trabajar con cookies y token jwt para guardar el id del usuario autenticado.
36-
- Vamos a usar passport para gestionar la autenticación.
37-
- Vamos a usar la extension de passport para gestionar la autenticación con Google
38-
39-
```bash
40-
npm install cookie-parser jsonwebtoken passport passport-google-oauth20 --save
41-
```
42-
43-
Y sus typings:
44-
45-
```bash
46-
npm install @types/jsonwebtoken @types/passport @types/passport-google-oauth20 --save-dev
47-
```
48-
49-
Pasamos a configurar las variables de entorno, creamos un fichero env
21+
**Ojo! Primero tenemos que crearnos un fichero .env con el siguiente contenido:**
5022

5123
**No mostrar esto por pantalla, ni almacenar O:-)**
5224

@@ -67,11 +39,35 @@ _./src/env.constants.ts_
6739
export const envConstants = {
6840
NODE_ENV: process.env.NODE_ENV,
6941
PORT: process.env.PORT,
70-
+ GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
71-
+ GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET
42+
+ GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
43+
+ GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET
7244
};
7345
```
7446

47+
Ahora sí, volvemos a ejecutar el `npm install`. Podemos ver que hay dos endpoints interesantes:
48+
49+
http://localhost:3000
50+
51+
http://localhost:3000/api
52+
53+
En uno se muestra una página, en la otra tenemos un endpoint que devuelve json
54+
55+
Ahora vamos a parar la ejecución e instalar las dependencias que necesitamos, que en este caso son las siguientes:
56+
57+
- Vamos a trabajar con cookies y token jwt para guardar el id del usuario autenticado.
58+
- Vamos a usar passport para gestionar la autenticación.
59+
- Vamos a usar la extension de passport para gestionar la autenticación con Google
60+
61+
```bash
62+
npm install cookie-parser jsonwebtoken passport passport-google-oauth20 --save
63+
```
64+
65+
Y sus typings:
66+
67+
```bash
68+
npm install @types/jsonwebtoken @types/passport @types/passport-google-oauth20 --save-dev
69+
```
70+
7571
Vamos a crearnos un repo mock (en memoria) para almacenar
7672
el perfil del usuario:
7773

@@ -119,7 +115,7 @@ export const userProfileExists = async (
119115
const index =
120116
userCollection.findIndex(
121117
(user) => user.googleId === googleProfileId
122-
) ?? null;
118+
);
123119

124120
return index !== -1;
125121
};
@@ -137,15 +133,14 @@ export const addNewUser = async (user: User): Promise<User> => {
137133
return newUser;
138134
};
139135

140-
export const getUserByGoogleId = async (googleId: string): Promise<User> => {
141-
const user =
142-
userCollection.find((user) => user.googleId === googleId) ?? null;
136+
export const getUser = async (id: number): Promise<User> => {
137+
const user = userCollection.find((user) => user.id === id);
143138

144139
return user;
145140
};
146141

147-
export const getUser = async (id: number): Promise<User> => {
148-
const user = userCollection.find((user) => user.id === id) ?? null;
142+
export const getUserByGoogleId = async (googleId: string): Promise<User> => {
143+
const user = userCollection.find((user) => user.googleId === googleId);
149144

150145
return user;
151146
};
@@ -364,8 +359,8 @@ api.get(
364359
'/callback',
365360
passport.authenticate('google', { failureRedirect: '/', session: false }),
366361
(req, res) => {
367-
console.log(req.user);
368-
console.log('Llego respuesta de google');
362+
console.log('Ha llegado la respuesta de Google');
363+
console.log(req.user);
369364
const user = req.user as User;
370365
const token = createAccessToken(user.id);
371366
res.cookie(COOKIE_NAME, token, {
@@ -442,9 +437,23 @@ app.listen(envConstants.PORT, () => {
442437
npm start
443438
```
444439

445-
Lo ideal aquí es depurarlo, para poner un break point (nodejs debugging console) en el primero api.get:
440+
Lo ideal aquí es, después de probar el funcionamiento de nuestro ejemplo.
441+
442+
Algunos sitios interesantes donde poner breakpoints:
446443

447-
añadimos esto
444+
_./setup/passport-config.ts_
445+
446+
Definición y callback
447+
448+
_./api.ts_
449+
450+
End point `/google`
451+
452+
End point `/callback`
453+
454+
End point `/user-profile`
455+
456+
Para depurar el endpoint `/google` tenemos que añadir esto:
448457

449458
_./src/setup/api.ts_
450459

@@ -459,20 +468,6 @@ api.get(
459468
);
460469
```
461470

462-
Sitios interesantes donde poner breakpoints:
463-
464-
_./setup/passport-config.ts_
465-
466-
Definición y callback
467-
468-
_./api.ts_
469-
470-
End point /google
471-
472-
End point /callback
473-
474-
End point /user-profile
475-
476471
# ¿Con ganas de ponerte al día con Backend?
477472

478473
Apuntate a nuestro [Bootcamp Backend Online Lemoncode](https://lemoncode.net/bootcamp-backend#bootcamp-backend/banner)

06-rest-api/05-oauth/02-cookie-and-jwt/src/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ api.get(
3535
'/callback',
3636
passport.authenticate('google', { failureRedirect: '/', session: false }),
3737
(req, res) => {
38+
console.log('Ha llegado la respuesta de Google');
3839
console.log(req.user);
39-
console.log('Llego respuesta de google');
4040
const user = req.user as User;
4141
const token = createAccessToken(user.id);
4242
res.cookie(COOKIE_NAME, token, {

06-rest-api/05-oauth/02-cookie-and-jwt/src/dals/repository/profile.mock.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const userProfileExists = async (
1212
const index =
1313
userCollection.findIndex(
1414
(user) => user.googleId === googleProfileId
15-
) ?? null;
15+
);
1616

1717
return index !== -1;
1818
};
@@ -30,15 +30,15 @@ export const addNewUser = async (user: User): Promise<User> => {
3030
return newUser;
3131
};
3232

33-
export const getUserByGoogleId = async (googleId: string): Promise<User> => {
34-
const user =
35-
userCollection.find((user) => user.googleId === googleId) ?? null;
33+
export const getUser = async (id: number): Promise<User> => {
34+
const user = userCollection.find((user) => user.id === id);
3635

3736
return user;
3837
};
3938

40-
export const getUser = async (id: number): Promise<User> => {
41-
const user = userCollection.find((user) => user.id === id) ?? null;
39+
export const getUserByGoogleId = async (googleId: string): Promise<User> => {
40+
const user =
41+
userCollection.find((user) => user.googleId === googleId);
4242

4343
return user;
4444
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"presets": [
3+
[
4+
"@babel/preset-env",
5+
{
6+
"targets": {
7+
"node": "14"
8+
}
9+
}
10+
],
11+
"@babel/preset-typescript"
12+
],
13+
"plugins": ["@babel/plugin-proposal-optional-chaining"],
14+
"env": {
15+
"development": {
16+
"sourceMaps": "inline"
17+
}
18+
}
19+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
end_of_line = lf
7+
charset = utf-8
8+
trim_trailing_whitespace = true
9+
insert_final_newline = true
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
NODE_ENV=development
2+
PORT=3000
3+
GOOGLE_CLIENT_ID=
4+
GOOGLE_CLIENT_SECRET=
5+
FACEBOOK_APP_ID=
6+
FACEBOOK_APP_SECRET=
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
node_modules
2+
dist
3+
coverage
4+
.awcache
5+
test-report.*
6+
junit.xml
7+
*.log
8+
*.orig
9+
package-lock.json
10+
yarn.lock
11+
.awcache
12+
public
13+
.env
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"singleQuote": true,
3+
"trailingComma": "es5",
4+
"endOfLine": "lf"
5+
}

0 commit comments

Comments
 (0)