-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauth.js
More file actions
110 lines (96 loc) · 3.19 KB
/
auth.js
File metadata and controls
110 lines (96 loc) · 3.19 KB
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
const express = require("express");
const passport = require("passport");
const logger = require("pino")();
const axios = require("axios");
const fs = require("fs");
const OAuth2Strategy = require("passport-oauth2").Strategy;
const router = express.Router();
const User = require("./models/user");
const { loggedIn, notLoggedIn } = require("./ensure");
const reactHost = process.env.FRONT_END || "http://localhost:4000"
const updateUser = (user,me) => {
user.username = me.username
user.previous_usernames = me.previous_usernames
user.country = me.country_code
user.avatarUrl = me.avatar_url,
user.discord = me.discord || ""
user.kudosu = me.kudosu.total
user.mapping_follower_count = me.mapping_follower_count
user.ranked_beatmapset_count = me.ranked_and_approved_beatmapset_count
logger.info(`updated user ${ user.username}`)
}
const updateFriends = (user,friends) => {
user.friend_ids = friends.map(user => user.id)
logger.info(`updated friends for user ${ user.username}`)
}
const apiV2 = "https://osu.ppy.sh/api/v2"
passport.use(
new OAuth2Strategy(
{
authorizationURL: "https://osu.ppy.sh/oauth/authorize",
tokenURL: "https://osu.ppy.sh/oauth/token",
clientID: process.env.OSU_CLIENT_ID,
clientSecret: process.env.OSU_CLIENT_SECRET,
callbackURL: process.env.API_HOST+"/auth/osu/callback",
scope: ["friends.read","identify","public"]
},
async (accessToken, refreshToken, profile, done) => {
logger.info(profile)
const me = await axios
.get(apiV2+"/me", {
headers: { Authorization: `Bearer ${accessToken}` },
})
.then((res) => {
return res.data;
});
// fs.writeFileSync("me.json", JSON.stringify(me));
let user = await User.findOne({ osuId: me.id });
if (!user) {
user = new User({
osuId: me.id,
enabled: true,
createdDate: new Date()
});
}
updateUser(user,me)
user.accessToken = accessToken
user.refreshToken = refreshToken
const friends = await axios.get(apiV2+"/friends", {
headers: { Authorization: `Bearer ${accessToken}` },
}).then((res)=>{
return res.data;
});
// fs.writeFileSync("friends.json", JSON.stringify(friends));
updateFriends(user,friends)
await user.save();
done(null, user);
}
)
);
passport.serializeUser((user, done) => {
done(null, user._id);
});
passport.deserializeUser(async (id, done) => {
const user = await User.findById(id);
done(null, user);
});
router.get("/login", notLoggedIn, passport.authenticate("oauth2"));
router.get("/logout", loggedIn, (req, res) => {
logger.info(`User ${req.user.username} logged out`)
req.logout();
req.session.destroy();
res.redirect(reactHost);
});
const cookieOpts = { sameSite: "none", secure: true}
router.get(
"/osu/callback",
passport.authenticate("oauth2", { failureRedirect: "/login" }),
function (req, res) {
// Successful authentication!
logger.info("Successful authentication!");
res.cookie("username",req.user.username, cookieOpts)
res.cookie("avatar",req.user.avatarUrl, cookieOpts)
res.redirect(reactHost);
}
);
module.exports = router;