login #1

Merged
enub merged 2 commits from login into main 2025-06-12 23:23:14 +02:00
6 changed files with 122 additions and 0 deletions

8
backend/Dockerfile Normal file
View 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
View 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
View 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
View 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
View 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
View 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