-
Notifications
You must be signed in to change notification settings - Fork 5
/
index.js
124 lines (105 loc) · 4.08 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'use strict';
const TwitchOAuth = require('./src/twitch-oauth');
if (module === require.main) {
if (process.argv[2] && process.argv[2] === '-a') {
console.log('App access implementation.');
const { appAccess } = require('./example/flows');
appAccess.listen();
} else if (process.argv[2] && process.argv[2] === '-u') {
console.log('User access implementation.');
const { userAccess } = require('./example/flows');
userAccess.listen();
} else {
console.log('Deprecated user access implementation.');
require('dotenv').config();
const express = require('express');
const crypto = require('crypto');
const qs = require('querystring');
const app = express();
const buffer = crypto.randomBytes(16);
const state = buffer.toString('hex');
const twitchOAuth = new TwitchOAuth({
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
redirect_uri: process.env.REDIRECT_URI,
scopes: [
'user:edit:broadcast',
'viewing_activity_read',
'user:edit:follows'
]
}, state);
/**
*
* @returns ds: Local Date String, ts: Local Time String
*
*/
function getLogDateTime() {
const date = new Date();
return { ds: date.toLocaleDateString(), ts: date.toLocaleTimeString() };
}
app.get('/', (req, res) => {
res.status(200).send(`<a href="/authorize">Authorize</a>`);
});
app.get('/home', (req, res) => {
res.status(200).send(`<a href="/test">Test</a>`);
});
app.get('/test', async (req, res) => {
const url = `https://api.twitch.tv/helix/users/extensions?user_id=${101223367}`;
try {
const json = await twitchOAuth.getEndpoint(url);
res.status(200).json({ json });
} catch (err) {
console.error(err);
res.redirect('/failed');
}
});
app.get('/authorize', (req, res) => {
res.redirect(twitchOAuth.authorizeUrl);
});
app.get('/auth-callback', async (req, res) => {
const req_data = qs.parse(req.url.split('?')[1]);
const code = req_data['code'];
const state = req_data['state'];
try {
twitchOAuth.confirmState(state);
await twitchOAuth.fetchToken(code);
const { ds, ts } = getLogDateTime();
console.log(`authenticated ${ts} ${ds}`);
res.redirect('/home');
} catch (err) {
console.error(err);
res.redirect('/failed');
}
});
app.get('/validate', async (req, res) => {
try {
const validated = await twitchOAuth.validate();
const { ds, ts } = getLogDateTime();
console.log(`validated: ${validated} ${ts} ${ds}`);
res.redirect(`/home?validated=${validated}`);
} catch (error) {
console.error(err);
res.redirect(`/failed?validated`);
}
});
app.get('/revoke', async (req, res) => {
try {
const revoked = await twitchOAuth.revoke();
const { ds, ts } = getLogDateTime();
console.log(`revoked: ${revoked} ${ts} ${ds}`);
res.redirect(`/home?revoked=${revoked}`);
} catch (error) {
console.error(err);
res.redirect(`/failed?revoked`);
}
});
const server = app.listen(process.env.PORT || 4000, () => {
const port = server.address().port;
console.log(`Server listening on port ${port}`);
const url = twitchOAuth.authorizeUrl;
const open = require('open');
open(url);
});
}
}
module.exports = TwitchOAuth;