Add backend for query / datasource auth
This commit is contained in:
parent
ce075c97ff
commit
9cbe03fd66
2 changed files with 98 additions and 1 deletions
|
@ -13,6 +13,25 @@ const BodyTypes = {
|
||||||
TEXT: "text",
|
TEXT: "text",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum AuthType {
|
||||||
|
BASIC = "basic",
|
||||||
|
BEARER = "bearer"
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AuthConfig {
|
||||||
|
id: string
|
||||||
|
type: AuthType
|
||||||
|
config: BasicAuthConfig | BearerAuthConfig
|
||||||
|
}
|
||||||
|
interface BasicAuthConfig {
|
||||||
|
username: string,
|
||||||
|
password: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BearerAuthConfig {
|
||||||
|
token: string,
|
||||||
|
}
|
||||||
|
|
||||||
const coreFields = {
|
const coreFields = {
|
||||||
path: {
|
path: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldTypes.STRING,
|
||||||
|
@ -46,6 +65,7 @@ module RestModule {
|
||||||
defaultHeaders: {
|
defaultHeaders: {
|
||||||
[key: string]: any
|
[key: string]: any
|
||||||
}
|
}
|
||||||
|
authConfigs: AuthConfig[]
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Request {
|
interface Request {
|
||||||
|
@ -149,12 +169,32 @@ module RestModule {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async _req({ path = "", queryString = "", headers = {}, json = {}, method = "GET" }) {
|
processAuth(authConfigId: string) {
|
||||||
|
if (!this.config.authConfigs) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const authConfig = this.config.authConfigs.filter(authConfig => authConfig.id === authConfigId)[0]
|
||||||
|
let config
|
||||||
|
switch (authConfig.type) {
|
||||||
|
case AuthType.BASIC:
|
||||||
|
config = authConfig.config as BasicAuthConfig
|
||||||
|
this.headers.Authorization = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString("base64")}`
|
||||||
|
break
|
||||||
|
case AuthType.BEARER:
|
||||||
|
config = authConfig.config as BearerAuthConfig
|
||||||
|
this.headers.Authorization = `Bearer ${config.token}`
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async _req({ path = "", queryString = "", headers = {}, json = {}, method = "GET", authConfigId = "" }) {
|
||||||
this.headers = {
|
this.headers = {
|
||||||
...this.config.defaultHeaders,
|
...this.config.defaultHeaders,
|
||||||
...headers,
|
...headers,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.processAuth(authConfigId)
|
||||||
|
|
||||||
const input: any = { method, headers: this.headers }
|
const input: any = { method, headers: this.headers }
|
||||||
if (json && typeof json === "object" && Object.keys(json).length > 0) {
|
if (json && typeof json === "object" && Object.keys(json).length > 0) {
|
||||||
input.body = JSON.stringify(json)
|
input.body = JSON.stringify(json)
|
||||||
|
@ -189,5 +229,6 @@ module RestModule {
|
||||||
module.exports = {
|
module.exports = {
|
||||||
schema: SCHEMA,
|
schema: SCHEMA,
|
||||||
integration: RestIntegration,
|
integration: RestIntegration,
|
||||||
|
AuthType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ jest.mock("node-fetch", () =>
|
||||||
)
|
)
|
||||||
const fetch = require("node-fetch")
|
const fetch = require("node-fetch")
|
||||||
const RestIntegration = require("../rest")
|
const RestIntegration = require("../rest")
|
||||||
|
const { AuthType } = require("../rest")
|
||||||
|
|
||||||
class TestConfiguration {
|
class TestConfiguration {
|
||||||
constructor(config = {}) {
|
constructor(config = {}) {
|
||||||
|
@ -26,6 +27,10 @@ describe("REST Integration", () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// afterEach(() => {
|
||||||
|
// jest.clearAllMocks()
|
||||||
|
// })
|
||||||
|
|
||||||
it("calls the create method with the correct params", async () => {
|
it("calls the create method with the correct params", async () => {
|
||||||
const query = {
|
const query = {
|
||||||
path: "api",
|
path: "api",
|
||||||
|
@ -103,4 +108,55 @@ describe("REST Integration", () => {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("authentication", () => {
|
||||||
|
const basicAuth = {
|
||||||
|
id: "basic-1",
|
||||||
|
type : AuthType.BASIC,
|
||||||
|
config : {
|
||||||
|
username: "user",
|
||||||
|
password: "password"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const bearerAuth = {
|
||||||
|
id: "bearer-1",
|
||||||
|
type : AuthType.BEARER,
|
||||||
|
config : {
|
||||||
|
"token": "mytoken"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
config = new TestConfiguration({
|
||||||
|
url: BASE_URL,
|
||||||
|
authConfigs : [basicAuth, bearerAuth]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("adds basic auth", async () => {
|
||||||
|
const query = {
|
||||||
|
authConfigId: "basic-1"
|
||||||
|
}
|
||||||
|
await config.integration.read(query)
|
||||||
|
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
Authorization: "Basic dXNlcjpwYXNzd29yZA=="
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("adds bearer auth", async () => {
|
||||||
|
const query = {
|
||||||
|
authConfigId: "bearer-1"
|
||||||
|
}
|
||||||
|
await config.integration.read(query)
|
||||||
|
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer mytoken"
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue