Ver Fonte

@uppy/companion: rename `authProvider` to `oauthProvider` (#5198)

Mikael Finstad há 11 meses atrás
pai
commit
3878f2ee2f

+ 1 - 0
docs/guides/migration-guides.md

@@ -16,6 +16,7 @@ These cover all the major Uppy versions and how to migrate to them.
   provider, you should not be affected.
   - The static `getExtraConfig` property has been renamed to
     `getExtraGrantConfig`.
+  - The static `authProvider` property has been renamed to `oauthProvider`.
 - Endpoint `GET /s3/params` now returns `{ method: "POST" }` instead of
   `{ method: "post" }`. This will not affect most people.
 - The Companion [`error` event](https://uppy.io/docs/companion/#events) now no

+ 1 - 1
examples/custom-provider/server/CustomProvider.cjs

@@ -34,7 +34,7 @@ function adaptData (res) {
 class MyCustomProvider {
   static version = 2
 
-  static get authProvider () {
+  static get oauthProvider () {
     return 'myunsplash'
   }
 

+ 6 - 6
packages/@uppy/companion/src/companion.js

@@ -79,9 +79,9 @@ module.exports.app = (optionsArg = {}) => {
     providerManager.addCustomProviders(customProviders, providers, grantConfig)
   }
 
-  const getAuthProvider = (providerName) => providers[providerName]?.authProvider
+  const getOauthProvider = (providerName) => providers[providerName]?.oauthProvider
 
-  providerManager.addProviderOptions(options, grantConfig, getAuthProvider)
+  providerManager.addProviderOptions(options, grantConfig, getOauthProvider)
 
   // mask provider secrets from log messages
   logger.setMaskables(getMaskableSecrets(options))
@@ -103,7 +103,7 @@ module.exports.app = (optionsArg = {}) => {
   // override provider credentials at request time
   // Making `POST` request to the `/connect/:provider/:override?` route requires a form body parser middleware:
   // See https://github.com/simov/grant#dynamic-http
-  app.use('/connect/:authProvider/:override?', express.urlencoded({ extended: false }), getCredentialsOverrideMiddleware(providers, options))
+  app.use('/connect/:oauthProvider/:override?', express.urlencoded({ extended: false }), getCredentialsOverrideMiddleware(providers, options))
   app.use(Grant(grantConfig))
 
   app.use((req, res, next) => {
@@ -153,9 +153,9 @@ module.exports.app = (optionsArg = {}) => {
       const { key, secret } = options.providerOptions[providerName]
 
       function getRedirectUri() {
-        const authProvider = getAuthProvider(providerName)
-        if (!isOAuthProvider(authProvider)) return undefined
-        return grantConfig[authProvider]?.redirect_uri
+        const oauthProvider = getOauthProvider(providerName)
+        if (!isOAuthProvider(oauthProvider)) return undefined
+        return grantConfig[oauthProvider]?.redirect_uri
       }
 
       res.send({

+ 2 - 2
packages/@uppy/companion/src/server/controllers/connect.js

@@ -44,12 +44,12 @@ module.exports = function connect(req, res) {
     ]]
   }) || [])
 
-  const { authProvider } = providerClass
+  const { oauthProvider } = providerClass
   const qs = queryString({
     ...grantDynamicConfig,
     state,
   })
 
   // Now we redirect to grant's /connect endpoint, see `app.use(Grant(grantConfig))`
-  res.redirect(req.companion.buildURL(`/connect/${authProvider}${qs}`, true))
+  res.redirect(req.companion.buildURL(`/connect/${oauthProvider}${qs}`, true))
 }

+ 1 - 1
packages/@uppy/companion/src/server/controllers/logout.js

@@ -26,7 +26,7 @@ async function logout (req, res, next) {
     const { accessToken } = providerUserSession
     const data = await companion.provider.logout({ token: accessToken, providerUserSession, companion })
     delete companion.providerUserSession
-    tokenService.removeFromCookies(res, companion.options, companion.providerClass.authProvider)
+    tokenService.removeFromCookies(res, companion.options, companion.providerClass.oauthProvider)
     cleanSession()
     res.json({ ok: true, ...data })
   } catch (err) {

+ 3 - 3
packages/@uppy/companion/src/server/controllers/oauth-redirect.js

@@ -10,9 +10,9 @@ const oAuthState = require('../helpers/oauth-state')
  */
 module.exports = function oauthRedirect (req, res) {
   const params = qs.stringify(req.query)
-  const { authProvider } = req.companion.providerClass
+  const { oauthProvider } = req.companion.providerClass
   if (!req.companion.options.server.oauthDomain) {
-    res.redirect(req.companion.buildURL(`/connect/${authProvider}/callback?${params}`, true))
+    res.redirect(req.companion.buildURL(`/connect/${oauthProvider}/callback?${params}`, true))
     return
   }
 
@@ -25,7 +25,7 @@ module.exports = function oauthRedirect (req, res) {
   const handlerHostName = (new URL(handler)).host
 
   if (hasMatch(handlerHostName, req.companion.options.server.validHosts)) {
-    const url = `${handler}/connect/${authProvider}/callback?${params}`
+    const url = `${handler}/connect/${oauthProvider}/callback?${params}`
     res.redirect(url)
     return
   }

+ 7 - 7
packages/@uppy/companion/src/server/helpers/jwt.js

@@ -106,16 +106,16 @@ function getCommonCookieOptions ({ companionOptions }) {
   return cookieOptions
 }
 
-const getCookieName = (authProvider) => `uppyAuthToken--${authProvider}`
+const getCookieName = (oauthProvider) => `uppyAuthToken--${oauthProvider}`
 
-const addToCookies = ({ res, token, companionOptions, authProvider, maxAge = MAX_AGE_24H * 1000 }) => {
+const addToCookies = ({ res, token, companionOptions, oauthProvider, maxAge = MAX_AGE_24H * 1000 }) => {
   const cookieOptions = {
     ...getCommonCookieOptions({ companionOptions }),
     maxAge,
   }
 
   // send signed token to client.
-  res.cookie(getCookieName(authProvider), token, cookieOptions)
+  res.cookie(getCookieName(oauthProvider), token, cookieOptions)
 }
 
 module.exports.addToCookiesIfNeeded = (req, res, uppyAuthToken, maxAge) => {
@@ -125,7 +125,7 @@ module.exports.addToCookiesIfNeeded = (req, res, uppyAuthToken, maxAge) => {
       res,
       token: uppyAuthToken,
       companionOptions: req.companion.options,
-      authProvider: req.companion.providerClass.authProvider,
+      oauthProvider: req.companion.providerClass.oauthProvider,
       maxAge,
     })
   }
@@ -135,12 +135,12 @@ module.exports.addToCookiesIfNeeded = (req, res, uppyAuthToken, maxAge) => {
  *
  * @param {object} res
  * @param {object} companionOptions
- * @param {string} authProvider
+ * @param {string} oauthProvider
  */
-module.exports.removeFromCookies = (res, companionOptions, authProvider) => {
+module.exports.removeFromCookies = (res, companionOptions, oauthProvider) => {
   // options must be identical to those given to res.cookie(), excluding expires and maxAge.
   // https://expressjs.com/en/api.html#res.clearCookie
   const cookieOptions = getCommonCookieOptions({ companionOptions })
 
-  res.clearCookie(getCookieName(authProvider), cookieOptions)
+  res.clearCookie(getCookieName(oauthProvider), cookieOptions)
 }

+ 2 - 2
packages/@uppy/companion/src/server/middlewares.js

@@ -23,7 +23,7 @@ exports.hasSessionAndProvider = (req, res, next) => {
   return next()
 }
 
-const isOAuthProviderReq = (req) => isOAuthProvider(req.companion.providerClass.authProvider)
+const isOAuthProviderReq = (req) => isOAuthProvider(req.companion.providerClass.oauthProvider)
 const isSimpleAuthProviderReq = (req) => !!req.companion.providerClass.hasSimpleAuth
 
 /**
@@ -122,7 +122,7 @@ exports.gentleVerifyToken = (req, res, next) => {
 }
 
 exports.cookieAuthToken = (req, res, next) => {
-  req.companion.authToken = req.cookies[`uppyAuthToken--${req.companion.providerClass.authProvider}`]
+  req.companion.authToken = req.cookies[`uppyAuthToken--${req.companion.providerClass.oauthProvider}`]
   return next()
 }
 

+ 3 - 4
packages/@uppy/companion/src/server/provider/Provider.js

@@ -101,8 +101,7 @@ class Provider {
    *
    * @returns {string}
    */
-  // todo next major: rename authProvider to oauthProvider (we have other non-oauth auth types too now)
-  static get authProvider () {
+  static get oauthProvider () {
     return undefined
   }
 
@@ -121,5 +120,5 @@ class Provider {
 }
 
 module.exports = Provider
-// OAuth providers are those that have an `authProvider` set. It means they require OAuth authentication to work
-module.exports.isOAuthProvider = (authProvider) => typeof authProvider === 'string' && authProvider.length > 0
+// OAuth providers are those that have an `oauthProvider` set. It means they require OAuth authentication to work
+module.exports.isOAuthProvider = (oauthProvider) => typeof oauthProvider === 'string' && oauthProvider.length > 0

+ 2 - 2
packages/@uppy/companion/src/server/provider/box/index.js

@@ -34,7 +34,7 @@ class Box extends Provider {
     this.needsCookieAuth = true
   }
 
-  static get authProvider () {
+  static get oauthProvider () {
     return 'box'
   }
 
@@ -119,7 +119,7 @@ class Box extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: Box.authProvider,
+      providerName: Box.oauthProvider,
       isAuthError: (response) => response.statusCode === 401,
       getJsonErrorMessage: (body) => body?.message,
     })

+ 2 - 2
packages/@uppy/companion/src/server/provider/credentials.js

@@ -71,8 +71,8 @@ async function fetchProviderKeys (providerName, companionOptions, credentialRequ
 exports.getCredentialsOverrideMiddleware = (providers, companionOptions) => {
   return async (req, res, next) => {
     try {
-      const { authProvider, override } = req.params
-      const [providerName] = Object.keys(providers).filter((name) => providers[name].authProvider === authProvider)
+      const { oauthProvider, override } = req.params
+      const [providerName] = Object.keys(providers).filter((name) => providers[name].oauthProvider === oauthProvider)
       if (!providerName) {
         next()
         return

+ 2 - 2
packages/@uppy/companion/src/server/provider/drive/index.js

@@ -50,7 +50,7 @@ async function getStats ({ id, token }) {
  * Adapter for API https://developers.google.com/drive/api/v3/
  */
 class Drive extends Provider {
-  static get authProvider () {
+  static get oauthProvider () {
     return 'google'
   }
 
@@ -214,7 +214,7 @@ class Drive extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: Drive.authProvider,
+      providerName: Drive.oauthProvider,
       isAuthError: (response) => (
         response.statusCode === 401
         || (response.statusCode === 400 && response.body?.error === 'invalid_grant') // Refresh token has expired or been revoked

+ 2 - 2
packages/@uppy/companion/src/server/provider/dropbox/index.js

@@ -60,7 +60,7 @@ class DropBox extends Provider {
     this.needsCookieAuth = true
   }
 
-  static get authProvider () {
+  static get oauthProvider () {
     return 'dropbox'
   }
 
@@ -141,7 +141,7 @@ class DropBox extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: DropBox.authProvider,
+      providerName: DropBox.oauthProvider,
       isAuthError: (response) => response.statusCode === 401,
       getJsonErrorMessage: (body) => body?.error_summary,
     })

+ 2 - 2
packages/@uppy/companion/src/server/provider/facebook/index.js

@@ -24,7 +24,7 @@ async function getMediaUrl ({ token, id }) {
  * Adapter for API https://developers.facebook.com/docs/graph-api/using-graph-api/
  */
 class Facebook extends Provider {
-  static get authProvider () {
+  static get oauthProvider () {
     return 'facebook'
   }
 
@@ -86,7 +86,7 @@ class Facebook extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: Facebook.authProvider,
+      providerName: Facebook.oauthProvider,
       isAuthError: (response) => typeof response.body === 'object' && response.body?.error?.code === 190, // Invalid OAuth 2.0 Access Token
       getJsonErrorMessage: (body) => body?.error?.message,
     })

+ 18 - 18
packages/@uppy/companion/src/server/provider/index.js

@@ -42,12 +42,12 @@ module.exports.getProviderMiddleware = (providers, grantConfig) => {
     const ProviderClass = providers[providerName]
     if (ProviderClass && validOptions(req.companion.options)) {
       const { allowLocalUrls } = req.companion.options
-      const { authProvider } = ProviderClass
+      const { oauthProvider } = ProviderClass
 
       let providerGrantConfig
-      if (isOAuthProvider(authProvider)) {
+      if (isOAuthProvider(oauthProvider)) {
         req.companion.getProviderCredentials = getCredentialsResolver(providerName, req.companion.options, req)
-        providerGrantConfig = grantConfig[authProvider]
+        providerGrantConfig = grantConfig[oauthProvider]
         req.companion.providerGrantConfig = providerGrantConfig
       }
 
@@ -85,11 +85,11 @@ module.exports.addCustomProviders = (customProviders, providers, grantConfig) =>
 
     // eslint-disable-next-line no-param-reassign
     providers[providerName] = customProvider.module
-    const { authProvider } = customProvider.module
+    const { oauthProvider } = customProvider.module
 
-    if (isOAuthProvider(authProvider)) {
+    if (isOAuthProvider(oauthProvider)) {
       // eslint-disable-next-line no-param-reassign
-      grantConfig[authProvider] = {
+      grantConfig[oauthProvider] = {
         ...customProvider.config,
         // todo: consider setting these options from a universal point also used
         // by official providers. It'll prevent these from getting left out if the
@@ -105,9 +105,9 @@ module.exports.addCustomProviders = (customProviders, providers, grantConfig) =>
  *
  * @param {{server: object, providerOptions: object}} companionOptions
  * @param {object} grantConfig
- * @param {(a: string) => string} getAuthProvider
+ * @param {(a: string) => string} getOauthProvider
  */
-module.exports.addProviderOptions = (companionOptions, grantConfig, getAuthProvider) => {
+module.exports.addProviderOptions = (companionOptions, grantConfig, getOauthProvider) => {
   const { server, providerOptions } = companionOptions
   if (!validOptions({ server })) {
     logger.warn('invalid provider options detected. Providers will not be loaded', 'provider.options.invalid')
@@ -124,40 +124,40 @@ module.exports.addProviderOptions = (companionOptions, grantConfig, getAuthProvi
   const { oauthDomain } = server
   const keys = Object.keys(providerOptions).filter((key) => key !== 'server')
   keys.forEach((providerName) => {
-    const authProvider = getAuthProvider?.(providerName)
+    const oauthProvider = getOauthProvider?.(providerName)
 
-    if (isOAuthProvider(authProvider) && grantConfig[authProvider]) {
+    if (isOAuthProvider(oauthProvider) && grantConfig[oauthProvider]) {
       // explicitly add providerOptions so users don't override other providerOptions.
       // eslint-disable-next-line no-param-reassign
-      grantConfig[authProvider].key = providerOptions[providerName].key
+      grantConfig[oauthProvider].key = providerOptions[providerName].key
       // eslint-disable-next-line no-param-reassign
-      grantConfig[authProvider].secret = providerOptions[providerName].secret
+      grantConfig[oauthProvider].secret = providerOptions[providerName].secret
       if (providerOptions[providerName].credentialsURL) {
         // eslint-disable-next-line no-param-reassign
-        grantConfig[authProvider].dynamic = ['key', 'secret', 'redirect_uri']
+        grantConfig[oauthProvider].dynamic = ['key', 'secret', 'redirect_uri']
       }
 
       const provider = exports.getDefaultProviders()[providerName]
-      Object.assign(grantConfig[authProvider], provider.getExtraGrantConfig())
+      Object.assign(grantConfig[oauthProvider], provider.getExtraGrantConfig())
 
       // override grant.js redirect uri with companion's custom redirect url
       const isExternal = !!server.implicitPath
       const redirectPath = `/${providerName}/redirect`
       // eslint-disable-next-line no-param-reassign
-      grantConfig[authProvider].redirect_uri = getURLBuilder(companionOptions)(redirectPath, isExternal)
+      grantConfig[oauthProvider].redirect_uri = getURLBuilder(companionOptions)(redirectPath, isExternal)
       if (oauthDomain) {
         const fullRedirectPath = getURLBuilder(companionOptions)(redirectPath, isExternal, true)
         // eslint-disable-next-line no-param-reassign
-        grantConfig[authProvider].redirect_uri = `${server.protocol}://${oauthDomain}${fullRedirectPath}`
+        grantConfig[oauthProvider].redirect_uri = `${server.protocol}://${oauthDomain}${fullRedirectPath}`
       }
 
       if (server.implicitPath) {
         // no url builder is used for this because grant internally adds the path
         // eslint-disable-next-line no-param-reassign
-        grantConfig[authProvider].callback = `${server.implicitPath}${grantConfig[authProvider].callback}`
+        grantConfig[oauthProvider].callback = `${server.implicitPath}${grantConfig[oauthProvider].callback}`
       } else if (server.path) {
         // eslint-disable-next-line no-param-reassign
-        grantConfig[authProvider].callback = `${server.path}${grantConfig[authProvider].callback}`
+        grantConfig[oauthProvider].callback = `${server.path}${grantConfig[oauthProvider].callback}`
       }
     }
   })

+ 2 - 2
packages/@uppy/companion/src/server/provider/instagram/graph/index.js

@@ -31,7 +31,7 @@ class Instagram extends Provider {
     }
   }
 
-  static get authProvider () {
+  static get oauthProvider () {
     return 'instagram'
   }
 
@@ -86,7 +86,7 @@ class Instagram extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: Instagram.authProvider,
+      providerName: Instagram.oauthProvider,
       isAuthError: (response) => typeof response.body === 'object' && response.body?.error?.code === 190, // Invalid OAuth 2.0 Access Token
       getJsonErrorMessage: (body) => body?.error?.message,
     })

+ 2 - 2
packages/@uppy/companion/src/server/provider/onedrive/index.js

@@ -23,7 +23,7 @@ const getRootPath = (query) => (query.driveId ? `drives/${query.driveId}` : 'me/
  * Adapter for API https://docs.microsoft.com/en-us/onedrive/developer/rest-api/
  */
 class OneDrive extends Provider {
-  static get authProvider () {
+  static get oauthProvider () {
     return 'microsoft'
   }
 
@@ -98,7 +98,7 @@ class OneDrive extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: OneDrive.authProvider,
+      providerName: OneDrive.oauthProvider,
       isAuthError: (response) => response.statusCode === 401,
       isUserFacingError: (response) => [400, 403].includes(response.statusCode),
       // onedrive gives some errors here that the user might want to know about

+ 2 - 2
packages/@uppy/companion/src/server/provider/zoom/index.js

@@ -30,7 +30,7 @@ async function findFile ({ client, meetingId, fileId, recordingStart }) {
  * Adapter for API https://marketplace.zoom.us/docs/api-reference/zoom-api
  */
 class Zoom extends Provider {
-  static get authProvider () {
+  static get oauthProvider () {
     return 'zoom'
   }
 
@@ -163,7 +163,7 @@ class Zoom extends Provider {
     return withProviderErrorHandling({
       fn,
       tag,
-      providerName: Zoom.authProvider,
+      providerName: Zoom.oauthProvider,
       isAuthError: (response) => authErrorCodes.includes(response.statusCode),
       getJsonErrorMessage: (body) => body?.message,
     })

+ 7 - 7
packages/@uppy/companion/test/__tests__/provider-manager.js

@@ -5,7 +5,7 @@ const { setDefaultEnv } = require('../mockserver')
 let grantConfig
 let companionOptions
 
-const getAuthProvider = (providerName) => providerManager.getDefaultProviders()[providerName]?.authProvider
+const getOauthProvider = (providerName) => providerManager.getDefaultProviders()[providerName]?.oauthProvider
 
 describe('Test Provider options', () => {
   beforeEach(() => {
@@ -16,7 +16,7 @@ describe('Test Provider options', () => {
   })
 
   test('adds provider options', () => {
-    providerManager.addProviderOptions(companionOptions, grantConfig, getAuthProvider)
+    providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
     expect(grantConfig.dropbox.key).toBe('dropbox_key')
     expect(grantConfig.dropbox.secret).toBe('dropbox_secret')
 
@@ -35,7 +35,7 @@ describe('Test Provider options', () => {
 
   test('adds extra provider config', () => {
     process.env.COMPANION_INSTAGRAM_KEY = '123456'
-    providerManager.addProviderOptions(getCompanionOptions(), grantConfig, getAuthProvider)
+    providerManager.addProviderOptions(getCompanionOptions(), grantConfig, getOauthProvider)
     expect(grantConfig.instagram).toEqual({
       transport: 'session',
       callback: '/instagram/callback',
@@ -104,7 +104,7 @@ describe('Test Provider options', () => {
 
     companionOptions = getCompanionOptions()
 
-    providerManager.addProviderOptions(companionOptions, grantConfig, getAuthProvider)
+    providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
 
     expect(grantConfig.dropbox.secret).toBe('xobpord')
     expect(grantConfig.box.secret).toBe('xwbepqd')
@@ -118,7 +118,7 @@ describe('Test Provider options', () => {
     delete companionOptions.server.host
     delete companionOptions.server.protocol
 
-    providerManager.addProviderOptions(companionOptions, grantConfig, getAuthProvider)
+    providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
     expect(grantConfig.dropbox.key).toBeUndefined()
     expect(grantConfig.dropbox.secret).toBeUndefined()
 
@@ -137,7 +137,7 @@ describe('Test Provider options', () => {
 
   test('sets a main redirect uri, if oauthDomain is set', () => {
     companionOptions.server.oauthDomain = 'domain.com'
-    providerManager.addProviderOptions(companionOptions, grantConfig, getAuthProvider)
+    providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
 
     expect(grantConfig.dropbox.redirect_uri).toBe('http://domain.com/dropbox/redirect')
     expect(grantConfig.box.redirect_uri).toBe('http://domain.com/box/redirect')
@@ -156,7 +156,7 @@ describe('Test Custom Provider options', () => {
           key: 'foo_key',
           secret: 'foo_secret',
         },
-        module: { authProvider: 'some_provider' },
+        module: { oauthProvider: 'some_provider' },
       },
     }, providers, grantConfig)
 

+ 9 - 8
packages/@uppy/companion/test/__tests__/providers.js

@@ -25,10 +25,11 @@ const OAUTH_STATE = 'some-cool-nice-encrytpion'
 const providers = require('../../src/server/provider').getDefaultProviders()
 
 const providerNames = Object.keys(providers)
-const AUTH_PROVIDERS = {
-  drive: 'google',
-  onedrive: 'microsoft',
-}
+const oauthProviders = Object.fromEntries(
+  Object.entries(providers).flatMap(([name, provider]) => (
+    provider.oauthProvider != null ? [[name, provider.oauthProvider]] : []
+  ))
+)
 const authData = {}
 providerNames.forEach((provider) => {
   authData[provider] = { accessToken: 'token value' }
@@ -372,16 +373,16 @@ describe('provider file gets downloaded from', () => {
 })
 
 describe('connect to provider', () => {
-  test.each(providerNames)('connect to %s via grant.js endpoint', (providerName) => {
-    const authProvider = AUTH_PROVIDERS[providerName] || providerName
+  test.each(providerNames)('connect to %s via grant.js endpoint', async (providerName) => {
+    const oauthProvider = oauthProviders[providerName]
 
-    if (authProvider.authProvider == null) return
+    if (oauthProvider == null) return
 
     await request(authServer)
       .get(`/${providerName}/connect?foo=bar`)
       .set('uppy-auth-token', token)
       .expect(302)
-      .expect('Location', `http://localhost:3020/connect/${authProvider}?state=${OAUTH_STATE}`)
+      .expect('Location', `http://localhost:3020/connect/${oauthProvider}?state=${OAUTH_STATE}`)
   })
 })