diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index 6c6e37499f..9961f9e953 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -102,6 +102,7 @@ import { PLACEHOLDER_EMPTY_EXECUTION_ID, } from '.'; import { extractValue } from './ExtractValue'; +import { getClientCredentialsToken } from './OAuth2Helper'; axios.defaults.timeout = 300000; // Prevent axios from adding x-form-www-urlencoded headers by default @@ -933,9 +934,10 @@ export async function requestOAuth2( }); let oauthTokenData = credentials.oauthTokenData as clientOAuth2.Data; + // if it's the first time using the credentials, get the access token and save it into the DB. if (credentials.grantType === OAuth2GrantType.clientCredentials && oauthTokenData === undefined) { - const { data } = await oAuthClient.credentials.getToken(); + const { data } = await getClientCredentialsToken(oAuthClient, credentials); // Find the credentials if (!node.credentials?.[credentialsType]) { @@ -950,7 +952,7 @@ export async function requestOAuth2( await additionalData.credentialsHelper.updateCredentials( nodeCredentials, credentialsType, - credentials as unknown as ICredentialDataDecryptedObject, + Object.assign(credentials, { oauthTokenData: data }), ); oauthTokenData = data; @@ -1005,7 +1007,7 @@ export async function requestOAuth2( // if it's OAuth2 with client credentials grant type, get a new token // instead of refreshing it. if (OAuth2GrantType.clientCredentials === credentials.grantType) { - newToken = await token.client.credentials.getToken(); + newToken = await getClientCredentialsToken(token.client, credentials); } else { newToken = await token.refresh(tokenRefreshOptions); } @@ -1073,7 +1075,7 @@ export async function requestOAuth2( // if it's OAuth2 with client credentials grant type, get a new token // instead of refreshing it. if (OAuth2GrantType.clientCredentials === credentials.grantType) { - newToken = await token.client.credentials.getToken(); + newToken = await getClientCredentialsToken(token.client, credentials); } else { newToken = await token.refresh(tokenRefreshOptions); } diff --git a/packages/core/src/OAuth2Helper.ts b/packages/core/src/OAuth2Helper.ts new file mode 100644 index 0000000000..a3ade7036f --- /dev/null +++ b/packages/core/src/OAuth2Helper.ts @@ -0,0 +1,22 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { ICredentialDataDecryptedObject } from 'n8n-workflow'; +import clientOAuth2 from 'client-oauth2'; + +export const getClientCredentialsToken = async ( + oAuth2Client: clientOAuth2, + credentials: ICredentialDataDecryptedObject, +): Promise => { + const options = {}; + if (credentials.authentication === 'body') { + Object.assign(options, { + headers: { + Authorization: '', + }, + body: { + client_id: credentials.clientId as string, + client_secret: credentials.clientSecret as string, + }, + }); + } + return oAuth2Client.credentials.getToken(options); +}; diff --git a/packages/nodes-base/credentials/OAuth2Api.credentials.ts b/packages/nodes-base/credentials/OAuth2Api.credentials.ts index 8a7ca45e97..3990812008 100644 --- a/packages/nodes-base/credentials/OAuth2Api.credentials.ts +++ b/packages/nodes-base/credentials/OAuth2Api.credentials.ts @@ -82,11 +82,6 @@ export class OAuth2Api implements ICredentialType { displayName: 'Authentication', name: 'authentication', type: 'options', - displayOptions: { - show: { - grantType: ['authorizationCode'], - }, - }, options: [ { name: 'Body',