Skip to content
Snippets Groups Projects
linkOrcid.js 1.46 KiB
Newer Older
const OrcidStrategy = require('passport-orcid')
const config = require('config')
const get = require('lodash/get')

const { clientID, clientSecret, callbackPath, successPath } = config.get(
  'orcid',
)

let userId
const LinkOrcid = app => {
  const { passport } = app.locals

  passport.serializeUser((user, done) => {
    done(null, user)
  })

  passport.deserializeUser((user, done) => {
    done(null, user)
  })

  passport.use(
    new OrcidStrategy(
      {
        sandbox: process.env.NODE_ENV !== 'production',
        callbackURL: `${config.get('pubsweet-client.baseUrl')}${callbackPath}`,
        clientID,
        clientSecret,
      },
      (accessToken, refreshToken, params, profile, done) => {
        profile = {
          orcid: params.orcid,
          name: params.name,
          accessToken,
          refreshToken,
          scope: params.scope,
          expiry: params.expires_in,
        }
        return done(null, profile)
      },
    ),
  )

  app.get(
    '/api/users/orcid',
    (req, res, next) => {
      userId = get(req, 'query.userId')
      next()
    },
    passport.authenticate('orcid'),
  )

  app.get(
    callbackPath,
    passport.authenticate('orcid', {
      failureRedirect: successPath,
    }),
    linkOrcidHandler(app.locals.models),
  )
}

const linkOrcidHandler = models => async (req, res) => {
  const user = await models.User.find(userId)
  user.orcid = req.user
  await user.save()
  res.redirect(successPath)
}

module.exports = LinkOrcid