From 5b881db19f2c15b61d59d255e58d2bbe3cebcb2f Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 6 Apr 2023 19:20:24 +0000 Subject: [PATCH] feat(strava): refresh token when expired --- .../src/apps/strava/auth/create-auth-data.ts | 26 ----- .../src/apps/strava/auth/generate-auth-url.ts | 20 ++++ .../backend/src/apps/strava/auth/index.ts | 95 ++----------------- .../src/apps/strava/auth/is-still-verified.ts | 8 +- .../src/apps/strava/auth/refresh-token.ts | 26 +++++ .../apps/strava/auth/verify-credentials.ts | 39 ++++---- 6 files changed, 74 insertions(+), 140 deletions(-) delete mode 100644 packages/backend/src/apps/strava/auth/create-auth-data.ts create mode 100644 packages/backend/src/apps/strava/auth/generate-auth-url.ts create mode 100644 packages/backend/src/apps/strava/auth/refresh-token.ts diff --git a/packages/backend/src/apps/strava/auth/create-auth-data.ts b/packages/backend/src/apps/strava/auth/create-auth-data.ts deleted file mode 100644 index eb4fe55f..00000000 --- a/packages/backend/src/apps/strava/auth/create-auth-data.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import qs from 'qs'; - -export default async function createAuthData($: IGlobalVariable) { - try { - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const redirectUri = oauthRedirectUrlField.value; - const searchParams = qs.stringify({ - client_id: $.auth.data.consumerKey as string, - redirect_uri: redirectUri, - approval_prompt: 'force', - response_type: 'code', - scope: 'read_all,profile:read_all,activity:read_all,activity:write', - }); - - await $.auth.set({ - url: `${$.app.baseUrl}/oauth/authorize?${searchParams}`, - }); - } catch (error) { - throw new Error( - `Error occured while verifying credentials: ${error}` - ); - } -} diff --git a/packages/backend/src/apps/strava/auth/generate-auth-url.ts b/packages/backend/src/apps/strava/auth/generate-auth-url.ts new file mode 100644 index 00000000..185a1ad1 --- /dev/null +++ b/packages/backend/src/apps/strava/auth/generate-auth-url.ts @@ -0,0 +1,20 @@ +import { URLSearchParams } from 'node:url'; +import { IField, IGlobalVariable } from '@automatisch/types'; + +export default async function createAuthData($: IGlobalVariable) { + const oauthRedirectUrlField = $.app.auth.fields.find( + (field: IField) => field.key == 'oAuthRedirectUrl' + ); + const redirectUri = oauthRedirectUrlField.value as string; + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId as string, + redirect_uri: redirectUri, + approval_prompt: 'force', + response_type: 'code', + scope: 'read_all,profile:read_all,activity:read_all,activity:write', + }); + + await $.auth.set({ + url: `${$.app.baseUrl}/oauth/authorize?${searchParams}`, + }); +} diff --git a/packages/backend/src/apps/strava/auth/index.ts b/packages/backend/src/apps/strava/auth/index.ts index 34fc86ee..df7d9b0d 100644 --- a/packages/backend/src/apps/strava/auth/index.ts +++ b/packages/backend/src/apps/strava/auth/index.ts @@ -1,6 +1,7 @@ -import createAuthData from './create-auth-data'; +import generateAuthUrl from './generate-auth-url'; import verifyCredentials from './verify-credentials'; import isStillVerified from './is-still-verified'; +import refreshToken from './refresh-token'; export default { fields: [ @@ -17,8 +18,8 @@ export default { clickToCopy: true, }, { - key: 'consumerKey', - label: 'Consumer Key', + key: 'clientId', + label: 'Client ID', type: 'string' as const, required: true, readOnly: false, @@ -28,8 +29,8 @@ export default { clickToCopy: false, }, { - key: 'consumerSecret', - label: 'Consumer Secret', + key: 'clientSecret', + label: 'Client Secret', type: 'string' as const, required: true, readOnly: false, @@ -39,89 +40,9 @@ export default { clickToCopy: false, }, ], - authenticationSteps: [ - { - step: 1, - type: 'mutation' as const, - name: 'createConnection', - arguments: [ - { - name: 'key', - value: '{key}', - }, - { - name: 'formattedData', - value: null, - properties: [ - { - name: 'consumerKey', - value: '{fields.consumerKey}', - }, - { - name: 'consumerSecret', - value: '{fields.consumerSecret}', - }, - ], - }, - ], - }, - { - step: 2, - type: 'mutation' as const, - name: 'createAuthData', - arguments: [ - { - name: 'id', - value: '{createConnection.id}', - }, - ], - }, - { - step: 3, - type: 'openWithPopup' as const, - name: 'openAuthPopup', - arguments: [ - { - name: 'url', - value: '{createAuthData.url}', - }, - ], - }, - { - step: 4, - type: 'mutation' as const, - name: 'updateConnection', - arguments: [ - { - name: 'id', - value: '{createConnection.id}', - }, - { - name: 'formattedData', - value: null, - properties: [ - { - name: 'code', - value: '{openAuthPopup.code}', - }, - ], - }, - ], - }, - { - step: 5, - type: 'mutation' as const, - name: 'verifyConnection', - arguments: [ - { - name: 'id', - value: '{createConnection.id}', - }, - ], - }, - ], - createAuthData, + generateAuthUrl, verifyCredentials, isStillVerified, + refreshToken, }; diff --git a/packages/backend/src/apps/strava/auth/is-still-verified.ts b/packages/backend/src/apps/strava/auth/is-still-verified.ts index 8f578344..d36919f2 100644 --- a/packages/backend/src/apps/strava/auth/is-still-verified.ts +++ b/packages/backend/src/apps/strava/auth/is-still-verified.ts @@ -2,12 +2,8 @@ import { IGlobalVariable } from '@automatisch/types'; import getCurrentUser from '../common/get-current-user'; const isStillVerified = async ($: IGlobalVariable) => { - try { - const user = await getCurrentUser($); - return !!user; - } catch (error) { - return false; - } + const user = await getCurrentUser($); + return !!user; }; export default isStillVerified; diff --git a/packages/backend/src/apps/strava/auth/refresh-token.ts b/packages/backend/src/apps/strava/auth/refresh-token.ts new file mode 100644 index 00000000..6f5b623f --- /dev/null +++ b/packages/backend/src/apps/strava/auth/refresh-token.ts @@ -0,0 +1,26 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const refreshToken = async ($: IGlobalVariable) => { + const params = { + client_id: $.auth.data.clientId as string, + client_secret: $.auth.data.clientSecret as string, + grant_type: 'refresh_token', + refresh_token: $.auth.data.refreshToken as string, + }; + + const { data } = await $.http.post( + '/v3/oauth/token', + null, + { params } + ); + + await $.auth.set({ + accessToken: data.access_token, + expiresIn: data.expires_in, + expiresAt: data.expires_at, + tokenType: data.token_type, + refreshToken: data.refresh_token, + }); +}; + +export default refreshToken; diff --git a/packages/backend/src/apps/strava/auth/verify-credentials.ts b/packages/backend/src/apps/strava/auth/verify-credentials.ts index 1226530d..ea539036 100644 --- a/packages/backend/src/apps/strava/auth/verify-credentials.ts +++ b/packages/backend/src/apps/strava/auth/verify-credentials.ts @@ -1,28 +1,25 @@ -import qs from 'qs'; import { IGlobalVariable } from '@automatisch/types'; const verifyCredentials = async ($: IGlobalVariable) => { - try { - const searchParams = { - client_id: $.auth.data.consumerKey, - client_secret: $.auth.data.consumerSecret, - code: $.auth.data.code, - grant_type: 'authorization_code', - }; - const { data } = await $.http.post( - `/v3/oauth/token?${qs.stringify(searchParams)}a`, - ); + const params = { + client_id: $.auth.data.clientId as string, + client_secret: $.auth.data.clientSecret as string, + code: $.auth.data.code as string, + grant_type: 'authorization_code', + }; + const { data } = await $.http.post( + '/v3/oauth/token', + null, + { params } + ); - await $.auth.set({ - accessToken: data.access_token, - refreshToken: data.refresh_token, - tokenType: data.token_type, - userId: data.athlete.id, - screenName: `${data.athlete.firstname} ${data.athlete.lastname}`, - }); - } catch (error) { - throw new Error('Error occured while verifying credentials!'); - } + await $.auth.set({ + accessToken: data.access_token, + refreshToken: data.refresh_token, + tokenType: data.token_type, + athleteId: data.athlete.id, + screenName: `${data.athlete.firstname} ${data.athlete.lastname}`, + }); }; export default verifyCredentials;