You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/packages/login-with-google/lib.ts

56 lines
1.8 KiB
TypeScript

import 'hydrooj';
import * as superagent from 'superagent';
import proxy from 'superagent-proxy';
proxy(superagent);
async function get() {
const { system, token } = global.Hydro.model;
const [appid, url, [state]] = await Promise.all([
system.get('login-with-google.id'),
system.get('server.url'),
token.add(token.TYPE_OAUTH, 600, { redirect: this.request.referer }),
]);
this.response.redirect = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${appid}&response_type=code&redirect_uri=${url}oauth/google/callback&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile&state=${state}`;
}
async function callback({
state, code, error,
}) {
const { system, token } = global.Hydro.model;
const { UserFacingError } = global.Hydro.error;
if (error) throw new UserFacingError(error);
const [
[appid, secret, url, proxyUrl],
s,
] = await Promise.all([
system.getMany([
'login-with-google.id', 'oauth.googlesecret', 'server.url', 'proxy',
]),
token.get(state, token.TYPE_OAUTH),
]);
const res = await superagent.post('https://oauth2.googleapis.com/token')
.proxy(proxyUrl)
.send({
client_id: appid,
client_secret: secret,
code,
grant_type: 'authorization_code',
redirect_uri: `${url}oauth/google/callback`,
});
const payload = global.Hydro.lib.jwt.decode(res.body.id_token);
await token.del(state, token.TYPE_OAUTH);
this.response.redirect = s.redirect;
return {
email: payload.email,
uname: [payload.given_name, payload.name, payload.family_name],
viewLang: payload.locale.replace('-', '_'),
};
}
global.Hydro.lib.oauth_google = {
text: 'Login with Google',
callback,
get,
};