const strava = require('../shared/strava.js'); const withings = require('../shared/withings.js'); module.exports = async function (context, req) { context.log('Auth function processed a request'); // strava example: // https://www.strava.com/oauth/authorize?client_id=76033&response_type=code&redirect_uri=https://ohmyposh.dev/api/auth&approval_prompt=force&scope=read,activity:read&state=strava const code = (req.query.code || req.query._code || (req.body && req.body.code)); const segment = (req.query.state || (req.body && req.body.state)); let tokens = { access_token: '', refresh_token: '', expires_in: '', }; try { if (!code || !segment) { context.log(`Issue processing request: missing code (${code}) or segment (${segment})`); redirect(context, segment, tokens, 'missing code or segment'); return; } context.log(`Processing the ${segment} code`); switch (segment) { case "strava": tokens = await strava.getToken(code); break; case "withings": tokens = await withings.getToken(code); break; default: context.log(`Unknown segment: ${segment}`); redirect(context, segment, tokens, `Unknown segment: ${segment}`); return; } redirect(context, segment, tokens, ''); } catch (error) { if (!error.stack) { redirect(context, segment, tokens, toBase64(error)); return; } context.log(`Error: ${error.stack}`); redirect(context, segment, tokens, toBase64(error.stack)); } } function toBase64(str) { return Buffer.from(str).toString('base64'); } function redirect(context, segment, tokens, error) { const url = `${process.env['DOCS_LOCATION']}/docs/auth?segment=${segment}&access_token=${tokens.access_token}&refresh_token=${tokens.refresh_token}&expires_in=${tokens.expires_in}&error=${error}`; context.res = { status: 302, headers: { Location: url }, body: {} } context.done(); }