Fix OAuth-Token refresh

This commit is contained in:
Jan Oberhauser 2020-02-08 21:25:46 -08:00
parent 15e92ca494
commit 928bf4dc68
3 changed files with 24 additions and 10 deletions

View file

@ -66,6 +66,12 @@ export class CredentialsHelper extends ICredentialsHelper {
async updateCredentials(name: string, type: string, data: ICredentialDataDecryptedObject): Promise<void> { async updateCredentials(name: string, type: string, data: ICredentialDataDecryptedObject): Promise<void> {
const credentials = await this.getCredentials(name, type); const credentials = await this.getCredentials(name, type);
if (Db.collections!.Credentials === null) {
// The first time executeWorkflow gets called the Database has
// to get initialized first
await Db.init();
}
credentials.setData(data, this.encryptionKey); credentials.setData(data, this.encryptionKey);
const newCredentialsData = credentials.getDataToSave() as ICredentialsDb; const newCredentialsData = credentials.getDataToSave() as ICredentialsDb;
@ -75,7 +81,12 @@ export class CredentialsHelper extends ICredentialsHelper {
// TODO: also add user automatically depending on who is logged in, if anybody is logged in // TODO: also add user automatically depending on who is logged in, if anybody is logged in
// Save the credentials in DB // Save the credentials in DB
await Db.collections.Credentials!.save(newCredentialsData); const findQuery = {
name,
type,
};
await Db.collections.Credentials!.update(findQuery, newCredentialsData);
} }
} }

View file

@ -969,7 +969,7 @@ class App {
return ResponseHelper.sendErrorResponse(res, errorResponse); return ResponseHelper.sendErrorResponse(res, errorResponse);
} }
savedCredentialsData.oauthTokenData = JSON.stringify(oauthToken.data); savedCredentialsData.oauthTokenData = oauthToken.data;
_.unset(savedCredentialsData, 'csrfSecret'); _.unset(savedCredentialsData, 'csrfSecret');
credentials.setData(savedCredentialsData, encryptionKey); credentials.setData(savedCredentialsData, encryptionKey);

View file

@ -36,8 +36,8 @@ import {
} from 'n8n-workflow'; } from 'n8n-workflow';
import * as clientOAuth2 from 'client-oauth2'; import * as clientOAuth2 from 'client-oauth2';
import { get, unset } from 'lodash'; import { get } from 'lodash';
import * as express from "express"; import * as express from 'express';
import * as path from 'path'; import * as path from 'path';
import { OptionsWithUri } from 'request'; import { OptionsWithUri } from 'request';
import * as requestPromise from 'request-promise-native'; import * as requestPromise from 'request-promise-native';
@ -126,8 +126,13 @@ export function requestOAuth(this: IAllExecuteFunctions, credentialsType: string
throw new Error('OAuth credentials not connected!'); throw new Error('OAuth credentials not connected!');
} }
const oAuthClient = new clientOAuth2({}); const oAuthClient = new clientOAuth2({
const oauthTokenData = JSON.parse(credentials.oauthTokenData as string); clientId: credentials.clientId as string,
clientSecret: credentials.clientSecret as string,
accessTokenUri: credentials.accessTokenUrl as string,
});
const oauthTokenData = credentials.oauthTokenData as clientOAuth2.Data;
const token = oAuthClient.createToken(oauthTokenData); const token = oAuthClient.createToken(oauthTokenData);
// Signs the request by adding authorization headers or query parameters depending // Signs the request by adding authorization headers or query parameters depending
@ -142,9 +147,7 @@ export function requestOAuth(this: IAllExecuteFunctions, credentialsType: string
// Token is probably not valid anymore. So try refresh it. // Token is probably not valid anymore. So try refresh it.
const newToken = await token.refresh(); const newToken = await token.refresh();
const newCredentialsData = newToken.data; credentials.oauthTokenData = newToken.data;
unset(newCredentialsData, 'csrfSecret');
unset(newCredentialsData, 'oauthTokenData');
// Find the name of the credentials // Find the name of the credentials
if (!node.credentials || !node.credentials[credentialsType]) { if (!node.credentials || !node.credentials[credentialsType]) {
@ -153,7 +156,7 @@ export function requestOAuth(this: IAllExecuteFunctions, credentialsType: string
const name = node.credentials[credentialsType]; const name = node.credentials[credentialsType];
// Save the refreshed token // Save the refreshed token
await additionalData.credentialsHelper.updateCredentials(name, credentialsType, newCredentialsData); await additionalData.credentialsHelper.updateCredentials(name, credentialsType, credentials);
// Make the request again with the new token // Make the request again with the new token
const newRequestOptions = newToken.sign(requestOptions as clientOAuth2.RequestObject); const newRequestOptions = newToken.sign(requestOptions as clientOAuth2.RequestObject);