My site: https://parkovka.in.ua/
On the page: https://parkovka.in.ua/login there is 'Sign in with Google' button.
Error: GET https://parkovka.in.ua/auth/login/success 403 (Forbidden)
Image: https://imgur.com/a/ZbtxJGX
My app is based on React.js and Express.js. Server is Nginx.
passport.js
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const passport = require('passport');
const GOOGLE_CLIENT_ID = "secret code";
const GOOGLE_CLIENT_SECRET = "secret code";
passport.use(new GoogleStrategy({
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "/auth/google/callback",
scope: ["profile", "email"],
proxy: true
},
function(accessToken, refreshToken, profile, callback) {
callback(null, profile);
}
));
passport.serializeUser((user, callback)=> {
callback(null, user);
});
passport.deserializeUser((user, callback)=> {
callback(null, user);
});
auth.js
const router = require("express").Router();
const passport = require('passport');
require('dotenv').config();
let CLIENT_URL;
if (process.env.NODE_ENV === "production") {
CLIENT_URL = 'https://parkovka.in.ua';
} else {
CLIENT_URL = 'http://localhost:3000';
}
router.get("/login/success", (req, res)=>{
if(req.user) {
res.status(200).json({
error: false,
success: true,
message: "success",
user: req.user,
// cookies: req.cookies
});
} else {
res.status(403).json({
error: true,
message: "Not autorized",
});
}
});
router.get("/login/faild", (req, res)=>{
res.status(401).json({
success: false,
message: "failure"
});
});
router.get("/logout", (req, res)=>{
req.logout();
res.redirect(CLIENT_URL);
});
router.get("/google/callback", passport.authenticate("google", {
successRedirect: CLIENT_URL,
failureRedirect: "login/faild"
}));
router.get("/google", passport.authenticate("google", ["profile", "email"]));
module.exports = router;
Login.js
import React from 'react';
import GoogleButton from 'react-google-button'
import styles from './Login.module.scss';
const Login = () => {
const google = () => {
window.open(`${process.env.REACT_APP_DOMAIN}/auth/google`, '_self');
}
return (
<div className={styles.login}>
<div className={styles.login__alternative}>
<GoogleButton
onClick={google}
/>
</div>
</div>
);
}
export default Login;
ENV: REACT_APP_DOMAIN=https://parkovka.in.ua
server {
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name parkovka.in.ua;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/parkovka.in.ua/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/parkovka.in.ua/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
server_name www.parkovka.in.ua;
return 301 $scheme://parkovka.in.ua$request_uri;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/parkovka.in.ua/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/parkovka.in.ua/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = parkovka.in.ua) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
server_name parkovka.in.ua;
return 404; # managed by Certbot
}
server {
if ($host = www.parkovka.in.ua) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name www.parkovka.in.ua;
listen 80;
return 404; # managed by Certbot
}
index.js
const express = require('express');
const app = express();
const dotenv = require('dotenv');
const fs = require('fs');
// підключення монгуса
const mongoose = require("mongoose");
const authRoute = require("./routes/auth");
const postRoute = require("./routes/posts");
const categoryRoute = require("./routes/categories");
const multer = require("multer");
const path = require('path/posix');
const PORT = process.env.PORT || 5000;
const cookieSession = require('cookie-session');
const passport = require('passport');
const cors = require('cors');
const passportSetup = require('./passport');
let CLIENT_URL;
if (process.env.NODE_ENV === "production") {
CLIENT_URL = 'https://parkovka.in.ua';
} else {
CLIENT_URL = 'http://localhost:3000';
}
dotenv.config();
app.use(express.json());
app.use("/images", express.static(path.join(__dirname, "/images")));
app.use(cookieSession(
{
name: "session",
keys: ["lama"],
maxAge: 24*60*60*100
}
));
app.use(passport.initialize());
app.use(passport.session());
app.use(cors({
origin: CLIENT_URL,
methods: "GET,POST,PUT,DELETE",
credentials: true,
}));
app.enable('trust proxy');
// підключення монго дб
mongoose.connect(process.env.MONGO_URL)
.then(
console.log('connected mongo')
)
.catch( err => {
console.log(err)
});
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, path.join(__dirname, 'images'));
},
filename: function (req, file, cb) {
cb(
null,
file.originalname
);
},
});
const multi_upload = multer({storage,
fileFilter: (req, file, cb) => {
if (
file.mimetype == 'image/png' ||
file.mimetype == 'image/jpeg' ||
file.mimetype == 'image/jpg'
) {
cb(null, true);
} else {
cb(null, false);
const err = new Error('Only .jpg .jpeg .png images are supported!');
err.name = 'ExtensionError';
return cb(err);
}
},
}).array('uploadImages', 10);
app.post('/api/upload', (req, res) => {
multi_upload(req, res, function (err) {
console.log(req.files);
//multer error
if (err instanceof multer.MulterError) {
console.log(err);
res.status(500).send({error: { msg: `multer uploading error: ${err.message}` },}).end();
return;
} else if (err) {
//unknown error
if (err.name == 'ExtensionError') {
res.status(413).send({ error: { msg: `${err.message}` } }).end();
} else {
res.status(500).send({ error: { msg: `unknown uploading error: ${err.message}` } }).end();
}
return;
}
res.status(200).send('file uploaded');
});
});
app.use('/auth', authRoute);
app.use('/api/posts', postRoute);
app.use('/api/marks', categoryRoute);
app.use('/api/deleteImg/:arrayImages', (req, res, next) => {
const imagesArr = req.params.arrayImages.split(",");
for (const element of imagesArr) {
let path = `./images/${element}`;
fs.unlink(path, (err) => {
if (err) {
console.error(err)
return
}
});
}
})
app.use(express.static(path.join(__dirname, "/client/build")));
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '/client/build', 'index.html'));
});
app.listen(PORT, () => {
console.log('Backend is runningggg.');
});