import crypto from 'crypto'; import { URLSearchParams } from 'url'; import authScope from '../common/auth-scope.js'; export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( (field) => field.key == 'oAuthRedirectUrl' ); const redirectUri = oauthRedirectUrlField.value; const state = crypto.randomBytes(100).toString('base64url'); const codeVerifier = crypto.randomBytes(96).toString('base64url'); const codeChallenge = crypto .createHash('sha256') .update(codeVerifier) .digest('base64') .replace(/=/g, '') .replace(/\+/g, '-') .replace(/\//g, '_'); const searchParams = new URLSearchParams({ client_id: $.auth.data.clientId, redirect_uri: redirectUri, response_type: 'code', scope: authScope.join(' '), state, code_challenge: codeChallenge, code_challenge_method: 'S256', }); const url = `https://airtable.com/oauth2/v1/authorize?${searchParams.toString()}`; await $.auth.set({ url, originalCodeChallenge: codeChallenge, originalState: state, codeVerifier, }); }