login #1
8
backend/Dockerfile
Normal file
8
backend/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
FROM node:18-alpine
|
||||
LABEL authors="abauer2s"
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
COPY . .
|
||||
EXPOSE 5000
|
||||
CMD ["node", "server.js"]
|
||||
17
backend/auth/google.js
Normal file
17
backend/auth/google.js
Normal file
@ -0,0 +1,17 @@
|
||||
import passport from 'passport';
|
||||
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
|
||||
|
||||
passport.use(new GoogleStrategy({
|
||||
clientID: process.env.GOOGLE_CLIENT_ID,
|
||||
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
||||
callbackURL: "/auth/google/callback"
|
||||
}, (accessToken, refreshToken, profile, done) => {
|
||||
return done(null, profile);
|
||||
}));
|
||||
|
||||
passport.serializeUser((user, done) => {
|
||||
done(null, user);
|
||||
});
|
||||
passport.deserializeUser((user, done) => {
|
||||
done(null, user);
|
||||
});
|
||||
17
backend/package.json
Normal file
17
backend/package.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "auth-app",
|
||||
"version": "1.0.0",
|
||||
"main": "server.js",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "node server.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"dotenv": "^16.0.0",
|
||||
"ejs": "^3.1.8",
|
||||
"express": "^4.18.2",
|
||||
"express-session": "^1.17.3",
|
||||
"passport": "^0.6.0",
|
||||
"passport-google-oauth20": "^2.0.0"
|
||||
}
|
||||
}
|
||||
50
backend/server.js
Normal file
50
backend/server.js
Normal file
@ -0,0 +1,50 @@
|
||||
import express from 'express';
|
||||
import session from 'express-session';
|
||||
import passport from 'passport';
|
||||
import './auth/google.js';
|
||||
import dotenv from 'dotenv';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const app = express();
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
app.use(session({ secret: "urlaubsgeheimnis", resave: false, saveUninitialized: true }));
|
||||
app.use(passport.initialize());
|
||||
app.use(passport.session());
|
||||
|
||||
app.set('view engine', 'ejs');
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
|
||||
function isLoggedIn(req, res, next) {
|
||||
req.user ? next() : res.redirect('/');
|
||||
}
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.render('index', { user: req.user });
|
||||
});
|
||||
|
||||
app.get('/auth/google',
|
||||
passport.authenticate('google', { scope: ['profile', 'email'] }));
|
||||
|
||||
app.get('/auth/google/callback',
|
||||
passport.authenticate('google', { failureRedirect: '/' }),
|
||||
(req, res) => {
|
||||
res.redirect('/');
|
||||
});
|
||||
|
||||
app.get('/logout', (req, res) => {
|
||||
req.logout(() => {
|
||||
res.redirect('/');
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/protected', isLoggedIn, (req, res) => {
|
||||
res.send(`Hallo ${req.user.displayName}, du bist eingeloggt!`);
|
||||
});
|
||||
|
||||
app.listen(5000, () => {
|
||||
console.log("🚀 Server läuft auf http://localhost:5000");
|
||||
});
|
||||
21
backend/views/index.ejs
Normal file
21
backend/views/index.ejs
Normal file
@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Login mit Google</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<main class="container">
|
||||
<h1>Willkommen bei Urlaubsbilder!</h1>
|
||||
<% if (user) { %>
|
||||
<p>Angemeldet als <strong><%= user.displayName %></strong></p>
|
||||
<a href="/protected" role="button">Zur App</a>
|
||||
<a href="/logout">Logout</a>
|
||||
<% } else { %>
|
||||
<a href="/auth/google" role="button">Login mit Google</a>
|
||||
<% } %>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
9
docker-compose.yml
Normal file
9
docker-compose.yml
Normal file
@ -0,0 +1,9 @@
|
||||
version: '3.8'
|
||||
services:
|
||||
backend:
|
||||
build: ./backend
|
||||
ports:
|
||||
- "5000:5000"
|
||||
environment:
|
||||
GOOGLE_CLIENT_ID: your-client-id-here
|
||||
GOOGLE_CLIENT_SECRET: your-client-secret-here
|
||||
Loading…
x
Reference in New Issue
Block a user