const simpleOauthModule = require('simple-oauth2'); const randomstring = require('randomstring'); const Secrets = require('./lib/secrets'); const secrets = new Secrets({ GIT_HOSTNAME: 'https://github.com', OAUTH_TOKEN_PATH: '/login/oauth/access_token', OAUTH_AUTHORIZE_PATH: '/login/oauth/authorize', OAUTH_CLIENT_ID: 'foo', OAUTH_CLIENT_SECRET: 'bar', REDIRECT_URL: 'https://www.control-alt-del.org/oauth/callback', OAUTH_SCOPES: 'repo,user', }); function getScript(mess, content) { return ``; } module.exports.auth = (e, ctx, cb) => secrets.init() .then(() => { const oauth2 = simpleOauthModule.create({ client: { id: secrets.OAUTH_CLIENT_ID, secret: secrets.OAUTH_CLIENT_SECRET, }, auth: { tokenHost: secrets.GIT_HOSTNAME, tokenPath: secrets.OAUTH_TOKEN_PATH, authorizePath: secrets.OAUTH_AUTHORIZE_PATH, }, }); // Authorization uri definition const authorizationUri = oauth2.authorizationCode.authorizeURL({ redirect_uri: secrets.REDIRECT_URL, scope: secrets.OAUTH_SCOPES, state: randomstring.generate(32), }); cb(null, { statusCode: 302, headers: { Location: authorizationUri, }, }); }); module.exports.callback = (e, ctx, cb) => { let oauth2; secrets.init() .then(() => { oauth2 = simpleOauthModule.create({ client: { id: secrets.OAUTH_CLIENT_ID, secret: secrets.OAUTH_CLIENT_SECRET, }, auth: { tokenHost: secrets.GIT_HOSTNAME, tokenPath: secrets.OAUTH_TOKEN_PATH, authorizePath: secrets.OAUTH_AUTHORIZE_PATH, }, }); const options = { code: e.queryStringParameters.code, }; return oauth2.authorizationCode.getToken(options); }) .then((result) => { const token = oauth2.accessToken.create(result); cb( null, { statusCode: 200, headers: { 'Content-Type': 'text/html', }, body: getScript('success', { token: token.token.access_token, provider: 'github', }), }, ); }) .catch((err) => { cb(null, { statusCode: 200, headers: { 'Content-Type': 'text/html', }, body: getScript('error', err), }); }); }; module.exports.success = (e, ctx, cb) => cb( null, { statusCode: 204, body: '', }, ); module.exports.default = (e, ctx, cb) => { cb(null, { statusCode: 302, headers: { Location: '/auth', }, }); };