borders/app.js

122 lines
4.5 KiB
JavaScript

const express = require('express')
const config = require('./config.json')
const FormData = require('form-data')
const fetch = require('node-fetch')
const app = express()
const ejs = require('ejs')
app.use(require('express-session')(config.session))
app.engine('html', ejs.renderFile);
app.set('view engine', 'ejs')
app.get('/', async (req, res) => {
if (req.headers.cookie == undefined) {
console.log('No Cookies Found')
res.render('index.html', { signedIn: false, tokenRefreshed: 'false', json: {} })
}
if (req.headers.cookie !== undefined) {
console.log('Cookies Found')
if (req.headers.cookie.includes('bearer_token') == false) {
console.log('No Bearer Token Found')
if (req.headers.cookie.includes('refresh_token') == true) {
console.log('Refresh Token Found')
res.redirect('/login/refresh')
}
else {
console.log('No Refresh Token Found')
res.redirect('/login')
}
}
else {
console.log('Bearer Token Found')
var bearer_token = req.headers.cookie.split('bearer_token=')[1].split(';')[0]
var data = await fetch(`https://discord.com/api/users/@me`, {headers: { Authorization: `Bearer ${bearer_token}` } }) // Fetching user data
var json = await data.json()
if (req.query.tokenrefreshed == 'true') {
console.log('Token Refreshed')
res.render('index.html', { signedIn: true, tokenRefreshed: true, json })
}
else {
res.render('index.html', { signedIn: true, tokenRefreshed: false, json })
}
}
}
})
app.get('/login', (req, res) => {
res.redirect(`https://discord.com/api/oauth2/authorize` +
`?client_id=${config.oauth2.client_id}` +
`&redirect_uri=${encodeURIComponent(config.oauth2.redirect_uri)}` +
`&response_type=code&scope=${encodeURIComponent(config.oauth2.scopes.join(" "))}`)
})
app.get('/login/callback', async (req, res) => {
const accessCode = req.query.code
if (!accessCode) {return res.redirect('/401')}
// Creating form to make request
const data = new FormData()
data.append('client_id', config.oauth2.client_id)
data.append('client_secret', config.oauth2.client_secret)
data.append('grant_type', 'authorization_code')
data.append('redirect_uri', config.oauth2.redirect_uri)
data.append('scope', 'identify')
data.append('code', accessCode)
// Making request to oauth2/token to get the Bearer token
const json = await (await fetch('https://discord.com/api/oauth2/token', {method: 'POST', body: data})).json()
// Setting cookie with Bearer token
res.cookie("bearer_token", json.access_token, { maxAge: json.expires_in * 1000 })
res.cookie("refresh_token", json.refresh_token)
res.redirect('/') // Redirecting to main page
})
app.get('/login/refresh', async (req, res) => {
const refreshToken = req.headers.cookie.split('refresh_token=')[1].split(';')[0]
if (!refreshToken && !undefined) {return res.redirect('/401')}
else {console.log('Refresh Token Found')}
// Creating form to make request
const data = new FormData()
data.append('client_id', config.oauth2.client_id)
data.append('client_secret', config.oauth2.client_secret)
data.append('grant_type', 'refresh_token')
data.append('refresh_token', refreshToken)
// Making request to oauth2/token to get the Bearer token
const json = await (await fetch('https://discord.com/api/oauth2/token', {method: 'POST', body: data})).json()
// Setting cookie with Bearer token
res.cookie("bearer_token", json.access_token, { maxAge: json.expires_in * 1000 })
res.cookie("refresh_token", json.refresh_token)
console.log('New Bearer and Refresh tokens set')
res.redirect('/?tokenrefreshed=true') // Redirecting to main page
})
app.get('/logout', (req, res) => {
res.clearCookie("bearer_token")
res.clearCookie("refresh_token")
res.render('logout.html')
})
app.get('/error', (req, res) => {
res.render('error.html')
})
app.get('/401', (req, res) => {
res.render('401.html')
})
app.get('/404', (req, res) => {
res.render('404.html')
})
app.get('*', (req, res) => {
var route = req.url
res.render('404.html', { route })
})
// Starting our application
app.listen(config.port, () => {
console.log(`Listening at http://localhost:${config.port}/`)
})