store access token and refresh token in serverless mem

This commit is contained in:
spencerwooo
2021-12-31 15:17:39 +08:00
parent 3dde6ac73c
commit 72153cc852
8 changed files with 95 additions and 45 deletions
+29 -7
View File
@@ -5,11 +5,14 @@ import axios from 'axios'
import apiConfig from '../../config/api.json'
import siteConfig from '../../config/site.json'
import { revealObfuscatedToken } from '../../utils/accessTokenHandler'
import { revealObfuscatedToken } from '../../utils/oAuthHandler'
import { compareHashedToken } from '../../utils/protectedRouteHandler'
import { getOdAuthTokens, storeOdAuthTokens } from '../../utils/odAuthTokenStore'
import TokenStore from '../../utils/odAuthTokenStore'
const basePath = pathPosix.resolve('/', siteConfig.baseDirectory)
const clientSecret = revealObfuscatedToken(apiConfig.obfuscatedClientSecret)
const tokenStore = new TokenStore()
const basePath = pathPosix.resolve('/', apiConfig.base)
const encodePath = (path: string) => {
let encodedPath = pathPosix.join(basePath, pathPosix.resolve('/', path))
if (encodedPath === '/' || encodedPath === '') {
@@ -19,10 +22,8 @@ const encodePath = (path: string) => {
return `:${encodeURIComponent(encodedPath)}`
}
const clientSecret = revealObfuscatedToken(apiConfig.obfuscatedClientSecret)
async function getAccessToken(): Promise<any> {
const { accessToken, refreshToken } = await getOdAuthTokens()
const { accessToken, refreshToken } = await tokenStore.getOdAuthTokens()
// Return in storage access token if it is still valid
if (typeof accessToken === 'string') {
@@ -52,7 +53,7 @@ async function getAccessToken(): Promise<any> {
if ('access_token' in resp.data && 'refresh_token' in resp.data) {
const { expires_in, access_token, refresh_token } = resp.data
await storeOdAuthTokens({
await tokenStore.storeOdAuthTokens({
accessToken: access_token,
accessTokenExpiry: parseInt(expires_in),
refreshToken: refresh_token,
@@ -65,6 +66,27 @@ async function getAccessToken(): Promise<any> {
}
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
// If method is POST, then the API is called by the client to store acquired tokens
if (req.method === 'POST') {
const { obfuscatedAccessToken, accessTokenExpiry, obfuscatedRefreshToken } = req.body
const accessToken = revealObfuscatedToken(obfuscatedAccessToken)
const refreshToken = revealObfuscatedToken(obfuscatedRefreshToken)
if (typeof accessToken !== 'string' || typeof refreshToken !== 'string') {
res.status(400).send('Invalid request body')
return
}
await tokenStore.storeOdAuthTokens({
accessToken,
accessTokenExpiry,
refreshToken,
})
res.status(200).send('OK')
return
}
// If method is GET, then the API is a normal request to the OneDrive API for files or folders
const { path = '/', raw = false, next = '' } = req.query
// Sometimes the path parameter is defaulted to '[...path]' which we need to handle