diff --git a/backend/config/passportConfig.js b/backend/config/passportConfig.js index 842f50c..9767f2e 100644 --- a/backend/config/passportConfig.js +++ b/backend/config/passportConfig.js @@ -1,6 +1,8 @@ const passport = require("passport"); const LocalStrategy = require('passport-local').Strategy; const User = require("../models/User"); +const GitHubStrategy = require('passport-github2').Strategy; + passport.use( new LocalStrategy( @@ -29,6 +31,16 @@ passport.use( ) ); +passport.use(new GitHubStrategy({ + clientID: process.env.GITHUB_CLIENT_ID, + clientSecret: process.env.GITHUB_CLIENT_SECRET, + callbackURL: process.env.GITHUB_CALLBACK_URL, + }, + function(accessToken, refreshToken, profile, cb) { + return cb(null, profile); + } +)); + // Serialize user (store user info in session) passport.serializeUser((user, done) => { done(null, user.id); diff --git a/backend/package.json b/backend/package.json index 53bd64b..70ea45e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,6 +19,7 @@ "express-session": "^1.18.1", "mongoose": "^8.8.2", "passport": "^0.7.0", + "passport-github2": "^0.1.12", "passport-local": "^1.0.0" }, "devDependencies": { diff --git a/backend/routes/auth.js b/backend/routes/auth.js index e26c7a9..1570634 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -39,4 +39,18 @@ router.get("/logout", (req, res) => { }); }); +// Sign-in with Github routes +router.get('/github', passport.authenticate('github', { scope: ['user:email'] })); + +router.get('/github/callback', + passport.authenticate('github', { failureRedirect: 'api/auth/github/error' }), + (req, res) => { + res.redirect(`${process.env.CORS_ORIGIN}/home`); + } +); + +router.get('/github/error', (req, res) => { + res.redirect(`${process.env.CORS_ORIGIN}/login`); +}); + module.exports = router; diff --git a/src/App.tsx b/src/App.tsx index a49da65..8cb30ec 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,7 +16,7 @@ function App() { {/* Main content */} -
+
diff --git a/src/Routes/Login/Login.tsx b/src/Routes/Login/Login.tsx index 1c1f495..b69e175 100644 --- a/src/Routes/Login/Login.tsx +++ b/src/Routes/Login/Login.tsx @@ -1,6 +1,7 @@ import React, { useState, ChangeEvent, FormEvent } from "react"; import axios from "axios"; -import { useNavigate } from "react-router-dom"; // Import the hook for navigation +import { useNavigate, Link } from "react-router-dom"; // Import the hook for navigation +import GithubIcon from "@mui/icons-material/GitHub"; const backendUrl = import.meta.env.VITE_BACKEND_URL; interface LoginFormData { @@ -37,8 +38,12 @@ const Login: React.FC = () => { } }; + const handleGithubLogin = async () => { + window.location.href = `${import.meta.env.VITE_API_URL}/auth/github`; + }; + return ( -
+

Login

@@ -70,6 +75,20 @@ const Login: React.FC = () => { Login + +
+

+ Don't have an account?{" "} + + Sign up + +

+
{message &&

{message}

}
); diff --git a/src/Routes/Signup/Signup.tsx b/src/Routes/Signup/Signup.tsx index 40edaa8..40079c2 100644 --- a/src/Routes/Signup/Signup.tsx +++ b/src/Routes/Signup/Signup.tsx @@ -1,6 +1,6 @@ import React, { useState, ChangeEvent, FormEvent } from "react"; import axios from "axios"; -import { useNavigate } from "react-router-dom"; +import { useNavigate, Link } from "react-router-dom"; const backendUrl = import.meta.env.VITE_BACKEND_URL; interface SignUpFormData { @@ -39,7 +39,7 @@ const SignUp: React.FC = () => { }; return ( -
+

Sign Up

@@ -82,6 +82,14 @@ const SignUp: React.FC = () => { Sign Up +
+

+ Already a member?{" "} + + Login + +

+
{message &&

{message}

}
);