feat(core): enable sending client credentials in body (#4377)

*  Enable inject credentials in the body for OAuth2 CC

* 🐛 Persist token data

* 👕 Fix linting error
This commit is contained in:
Ricardo Espinoza 2022-10-20 11:15:28 -04:00 committed by GitHub
parent 356a42a187
commit 7fcd821cad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 9 deletions

View file

@ -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);
}

View file

@ -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<clientOAuth2.Token> => {
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);
};

View file

@ -82,11 +82,6 @@ export class OAuth2Api implements ICredentialType {
displayName: 'Authentication',
name: 'authentication',
type: 'options',
displayOptions: {
show: {
grantType: ['authorizationCode'],
},
},
options: [
{
name: 'Body',