mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-25 04:34:06 -08:00
fix(wekan Node): Fix authentication with new versions of Wekan (#4088)
This commit is contained in:
parent
b0397f0262
commit
764bd3522b
|
@ -1,4 +1,11 @@
|
|||
import { ICredentialType, INodeProperties } from 'n8n-workflow';
|
||||
import {
|
||||
IAuthenticateGeneric,
|
||||
ICredentialDataDecryptedObject,
|
||||
ICredentialTestRequest,
|
||||
ICredentialType,
|
||||
IHttpRequestHelper,
|
||||
INodeProperties,
|
||||
} from 'n8n-workflow';
|
||||
|
||||
export class WekanApi implements ICredentialType {
|
||||
name = 'wekanApi';
|
||||
|
@ -15,6 +22,9 @@ export class WekanApi implements ICredentialType {
|
|||
displayName: 'Password',
|
||||
name: 'password',
|
||||
type: 'string',
|
||||
typeOptions: {
|
||||
password: true,
|
||||
},
|
||||
default: '',
|
||||
},
|
||||
{
|
||||
|
@ -24,5 +34,43 @@ export class WekanApi implements ICredentialType {
|
|||
default: '',
|
||||
placeholder: 'https://wekan.yourdomain.com',
|
||||
},
|
||||
{
|
||||
displayName: 'Session Token',
|
||||
name: 'token',
|
||||
type: 'hidden',
|
||||
typeOptions: {
|
||||
expirable: true,
|
||||
},
|
||||
default: '',
|
||||
},
|
||||
];
|
||||
|
||||
async preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject) {
|
||||
const url = credentials.url as string;
|
||||
const { token } = (await this.helpers.httpRequest({
|
||||
method: 'POST',
|
||||
url: `${url.endsWith('/') ? url.slice(0, -1) : url}/users/login`,
|
||||
body: {
|
||||
username: credentials.username,
|
||||
password: credentials.password,
|
||||
},
|
||||
})) as { token: string };
|
||||
return { token };
|
||||
}
|
||||
|
||||
authenticate: IAuthenticateGeneric = {
|
||||
type: 'generic',
|
||||
properties: {
|
||||
headers: {
|
||||
Authorization: '=Bearer {{$credentials.token}}',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
test: ICredentialTestRequest = {
|
||||
request: {
|
||||
baseURL: '={{$credentials.url.replace(new RegExp("/$"), "")}}',
|
||||
url: '/api/user',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,52 +1,8 @@
|
|||
import {
|
||||
IExecuteFunctions,
|
||||
IExecuteSingleFunctions,
|
||||
IHookFunctions,
|
||||
ILoadOptionsFunctions,
|
||||
IWebhookFunctions,
|
||||
} from 'n8n-core';
|
||||
import { IExecuteFunctions, IHookFunctions, ILoadOptionsFunctions } from 'n8n-core';
|
||||
|
||||
import { OptionsWithUri } from 'request';
|
||||
|
||||
import {
|
||||
ICredentialDataDecryptedObject,
|
||||
IDataObject,
|
||||
NodeApiError,
|
||||
NodeOperationError,
|
||||
} from 'n8n-workflow';
|
||||
|
||||
export async function getAuthorization(
|
||||
this:
|
||||
| IHookFunctions
|
||||
| IExecuteFunctions
|
||||
| IExecuteSingleFunctions
|
||||
| ILoadOptionsFunctions
|
||||
| IWebhookFunctions,
|
||||
credentials?: ICredentialDataDecryptedObject,
|
||||
): Promise<IDataObject> {
|
||||
if (credentials === undefined) {
|
||||
throw new NodeOperationError(this.getNode(), 'No credentials got returned!');
|
||||
}
|
||||
|
||||
const { password, username } = credentials;
|
||||
const options: OptionsWithUri = {
|
||||
method: 'POST',
|
||||
form: {
|
||||
username,
|
||||
password,
|
||||
},
|
||||
uri: `${credentials.url}/users/login`,
|
||||
json: true,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await this.helpers.request!(options);
|
||||
|
||||
return { token: response.token, userId: response.id };
|
||||
} catch (error) {
|
||||
throw new NodeApiError(this.getNode(), error);
|
||||
}
|
||||
}
|
||||
import { IDataObject, JsonObject, NodeApiError, NodeOperationError } from 'n8n-workflow';
|
||||
|
||||
export async function apiRequest(
|
||||
this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions,
|
||||
|
@ -60,12 +16,9 @@ export async function apiRequest(
|
|||
|
||||
query = query || {};
|
||||
|
||||
const { token } = await getAuthorization.call(this, credentials);
|
||||
|
||||
const options: OptionsWithUri = {
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
method,
|
||||
body,
|
||||
|
@ -75,12 +28,11 @@ export async function apiRequest(
|
|||
};
|
||||
|
||||
try {
|
||||
return await this.helpers.request!(options);
|
||||
return await this.helpers.requestWithAuthentication.call(this, 'wekanApi', options);
|
||||
} catch (error) {
|
||||
if (error.statusCode === 401) {
|
||||
throw new NodeOperationError(this.getNode(), 'The Wekan credentials are not valid!');
|
||||
}
|
||||
|
||||
throw error;
|
||||
throw new NodeApiError(this.getNode(), error as JsonObject);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue