diff --git a/docs/api/auth/index.js b/docs/api/auth/index.js index d1af680a..cf742e8b 100644 --- a/docs/api/auth/index.js +++ b/docs/api/auth/index.js @@ -1,29 +1,31 @@ -const axios = require('axios'); +const strava = require('../shared/strava.js'); module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); - // 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 + // 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 try { const code = (req.query._code || (req.body && req.body.code)); - if (!code) { + const segment = (req.query.state || (req.body && req.body.state)); + if (!code || !segment) { context.res = { status: 400 }; return; } - const params = { - client_id: process.env['STRAVA_CLIENT_ID'], - client_secret: process.env['STRAVA_CLIENT_SECRET'], - code: code, - grant_type: 'authorization_code', - }; - const resp = await axios.post('https://www.strava.com/oauth/token', null, { params: params }); - - const body = { - access_token: resp.data.access_token, - refresh_token: resp.data.refresh_token, + let body = null; + switch (segment) { + case "strava": + body = await strava.getStravaToken(code); + break; + default: + context.res = { + body: "unknown segment", + status: 400 + }; + return; } context.res = { diff --git a/docs/api/auth/sample.dat b/docs/api/auth/sample.dat deleted file mode 100644 index 26aac46f..00000000 --- a/docs/api/auth/sample.dat +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "Azure" -} \ No newline at end of file diff --git a/docs/api/refresh/function.json b/docs/api/refresh/function.json new file mode 100644 index 00000000..7eb1f8f2 --- /dev/null +++ b/docs/api/refresh/function.json @@ -0,0 +1,19 @@ +{ + "bindings": [ + { + "authLevel": "anonymous", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "res" + } + ] +} diff --git a/docs/api/refresh/index.js b/docs/api/refresh/index.js new file mode 100644 index 00000000..9fdac6a5 --- /dev/null +++ b/docs/api/refresh/index.js @@ -0,0 +1,39 @@ +const strava = require('../shared/strava.js'); + +module.exports = async function (context, req) { + context.log('JavaScript HTTP trigger function processed a request.'); + // strava example: + // https://ohmyposh.dev/api/refresh?segment=strava&token= + + try { + const refresh_token = (req.query.token || (req.body && req.body.token)); + const segment = (req.query.segment || (req.body && req.body.segment)); + if (!refresh_token || !segment) { + context.res = { + status: 400 + }; + return; + } + + let body = null; + switch (segment) { + case "strava": + body = await strava.refreshStravaToken(refresh_token); + break; + default: + context.res = { + body: "unknown segment", + status: 400 + }; + return; + } + + context.res.json(body); + } catch (error) { + context.log(error); + context.res = { + body: error, + status: 500 + }; + } +} diff --git a/docs/api/shared/strava.js b/docs/api/shared/strava.js new file mode 100644 index 00000000..6b075f48 --- /dev/null +++ b/docs/api/shared/strava.js @@ -0,0 +1,38 @@ +const axios = require('axios'); + +async function getStravaToken(code) { + const params = { + client_id: process.env['STRAVA_CLIENT_ID'], + client_secret: process.env['STRAVA_CLIENT_SECRET'], + code: code, + grant_type: 'authorization_code', + }; + const resp = await axios.post('https://www.strava.com/api/v3/oauth/token', null, { params: params }); + + const body = { + access_token: resp.data.access_token, + refresh_token: resp.data.refresh_token, + } + return body; +} + +async function refreshStravaToken(refresh_token) { + const params = { + client_id: process.env['STRAVA_CLIENT_ID'], + client_secret: process.env['STRAVA_CLIENT_SECRET'], + refresh_token: refresh_token, + grant_type: 'refresh_token', + }; + const resp = await axios.post('https://www.strava.com/api/v3/oauth/token', null, { params: params }); + + const body = { + access_token: resp.data.access_token, + refresh_token: resp.data.refresh_token, + } + return body; +} + +module.exports = { + getStravaToken: getStravaToken, + refreshStravaToken: refreshStravaToken, +}