123 lines
4.6 KiB
JavaScript
123 lines
4.6 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) => {
|
|
var json = req.headers.cookie.split(';')
|
|
res.clearCookie("bearer_token", json[0].replace('bearer_token=', ''))
|
|
res.clearCookie("refresh_token", json[1].replace(' 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}/`)
|
|
}) |