auto fetch access token in gsheets integration
This commit is contained in:
parent
0a9ff92f14
commit
33717ceb30
|
@ -460,3 +460,4 @@ exports.getConfigParams = getConfigParams
|
|||
exports.getScopedFullConfig = getScopedFullConfig
|
||||
exports.generateNewUsageQuotaDoc = generateNewUsageQuotaDoc
|
||||
exports.generateDevInfoID = generateDevInfoID
|
||||
exports.getPlatformUrl = getPlatformUrl
|
||||
|
|
|
@ -2,7 +2,7 @@ const google = require("../google")
|
|||
const { Cookies, Configs } = require("../../../constants")
|
||||
const { clearCookie, getCookie } = require("../../../utils")
|
||||
const { getDB } = require("../../../db")
|
||||
const { getScopedConfig } = require("../../../db/utils")
|
||||
const { getScopedConfig, getPlatformUrl } = require("../../../db/utils")
|
||||
const environment = require("../../../environment")
|
||||
const { getGlobalDB } = require("../../../tenancy")
|
||||
|
||||
|
@ -21,10 +21,20 @@ async function fetchGoogleCreds() {
|
|||
return config
|
||||
}
|
||||
|
||||
async function platformUrl() {
|
||||
const db = getGlobalDB()
|
||||
const publicConfig = await getScopedConfig(db, {
|
||||
type: Configs.SETTINGS,
|
||||
})
|
||||
return getPlatformUrl(publicConfig)
|
||||
}
|
||||
|
||||
async function preAuth(passport, ctx, next) {
|
||||
// get the relevant config
|
||||
const googleConfig = await fetchGoogleCreds()
|
||||
let callbackUrl = `${environment.PLATFORM_URL}/api/global/auth/datasource/google/callback`
|
||||
const platUrl = await platformUrl()
|
||||
|
||||
let callbackUrl = `${platUrl}/api/global/auth/datasource/google/callback`
|
||||
const strategy = await google.strategyFactory(googleConfig, callbackUrl)
|
||||
|
||||
if (!ctx.query.appId || !ctx.query.datasourceId) {
|
||||
|
@ -41,8 +51,9 @@ async function preAuth(passport, ctx, next) {
|
|||
async function postAuth(passport, ctx, next) {
|
||||
// get the relevant config
|
||||
const config = await fetchGoogleCreds()
|
||||
const platUrl = await platformUrl()
|
||||
|
||||
let callbackUrl = `${environment.PLATFORM_URL}/api/global/auth/datasource/google/callback`
|
||||
let callbackUrl = `${platUrl}/api/global/auth/datasource/google/callback`
|
||||
const strategy = await google.strategyFactory(
|
||||
config,
|
||||
callbackUrl,
|
||||
|
|
|
@ -10,6 +10,7 @@ import { Table, TableSchema } from "../definitions/common"
|
|||
import { buildExternalTableId } from "./utils"
|
||||
import { DataSourceOperation, FieldTypes } from "../constants"
|
||||
import { GoogleSpreadsheet } from "google-spreadsheet"
|
||||
import fetch from "node-fetch"
|
||||
import env from "../environment"
|
||||
|
||||
module GoogleSheetsModule {
|
||||
|
@ -28,6 +29,16 @@ module GoogleSheetsModule {
|
|||
refreshToken: string
|
||||
}
|
||||
|
||||
interface AuthTokenRequest {
|
||||
client_id: string
|
||||
client_secret: string
|
||||
refresh_token: string
|
||||
}
|
||||
|
||||
interface AuthTokenResponse {
|
||||
access_token: string
|
||||
}
|
||||
|
||||
const SCHEMA: Integration = {
|
||||
plus: true,
|
||||
auth: {
|
||||
|
@ -40,6 +51,7 @@ module GoogleSheetsModule {
|
|||
friendlyName: "Google Sheets",
|
||||
datasource: {
|
||||
spreadsheetId: {
|
||||
display: "Google Sheet URL",
|
||||
type: DatasourceFieldTypes.STRING,
|
||||
required: true,
|
||||
},
|
||||
|
@ -135,6 +147,30 @@ module GoogleSheetsModule {
|
|||
return parts.length > 5 ? parts[5] : spreadsheetId
|
||||
}
|
||||
|
||||
async fetchAccessToken(
|
||||
payload: AuthTokenRequest
|
||||
): Promise<AuthTokenResponse> {
|
||||
const response = await fetch(
|
||||
"https://www.googleapis.com/oauth2/v4/token",
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
...payload,
|
||||
grant_type: "refresh_token",
|
||||
}),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
if (response.status !== 200) {
|
||||
throw new Error("Error authenticating with google sheets.")
|
||||
}
|
||||
|
||||
return response.json()
|
||||
}
|
||||
|
||||
async connect() {
|
||||
try {
|
||||
// Initialise oAuth client
|
||||
|
@ -154,14 +190,18 @@ module GoogleSheetsModule {
|
|||
clientId: googleConfig.clientID,
|
||||
clientSecret: googleConfig.clientSecret,
|
||||
})
|
||||
oauthClient.on("tokens", tokens => {
|
||||
|
||||
const tokenResponse = await this.fetchAccessToken({
|
||||
client_id: googleConfig.clientID,
|
||||
client_secret: googleConfig.clientSecret,
|
||||
refresh_token: this.config.auth.refreshToken,
|
||||
})
|
||||
|
||||
oauthClient.setCredentials({
|
||||
refresh_token: googleConfig.refreshToken,
|
||||
access_token: tokens.access_token,
|
||||
refresh_token: this.config.auth.refreshToken,
|
||||
access_token: tokenResponse.access_token,
|
||||
})
|
||||
})
|
||||
oauthClient.credentials.access_token = this.config.auth.accessToken
|
||||
oauthClient.credentials.refresh_token = this.config.auth.refreshToken
|
||||
|
||||
this.client.useOAuth2Client(oauthClient)
|
||||
await this.client.loadInfo()
|
||||
} catch (err) {
|
||||
|
|
Loading…
Reference in New Issue