auth.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /* global WIKI */
  2. const _ = require('lodash')
  3. const passport = require('passport')
  4. const fs = require('fs-extra')
  5. const path = require('path')
  6. const autoload = require('auto-load')
  7. module.exports = {
  8. strategies: {},
  9. init() {
  10. this.passport = passport
  11. // Serialization user methods
  12. passport.serializeUser(function (user, done) {
  13. done(null, user.id)
  14. })
  15. passport.deserializeUser(function (id, done) {
  16. WIKI.db.users.query().findById(id).then((user) => {
  17. if (user) {
  18. done(null, user)
  19. } else {
  20. done(new Error(WIKI.lang.t('auth:errors:usernotfound')), null)
  21. }
  22. return true
  23. }).catch((err) => {
  24. done(err, null)
  25. })
  26. })
  27. // Load authentication strategies
  28. const modules = _.values(autoload(path.join(WIKI.SERVERPATH, 'modules/authentication')))
  29. _.forEach(modules, (strategy) => {
  30. const strategyConfig = _.get(WIKI.config.auth.strategies, strategy.key, { isEnabled: false })
  31. strategyConfig.callbackURL = `${WIKI.config.site.host}${WIKI.config.site.path}login/${strategy.key}/callback`
  32. strategy.config = strategyConfig
  33. if (strategyConfig.isEnabled) {
  34. try {
  35. strategy.init(passport, strategyConfig)
  36. } catch (err) {
  37. WIKI.logger.error(`Authentication Provider ${strategy.title}: [ FAILED ]`)
  38. WIKI.logger.error(err)
  39. }
  40. }
  41. fs.readFile(path.join(WIKI.ROOTPATH, `assets/svg/auth-icon-${strategy.key}.svg`), 'utf8').then(iconData => {
  42. strategy.icon = iconData
  43. }).catch(err => {
  44. if (err.code === 'ENOENT') {
  45. strategy.icon = '[missing icon]'
  46. } else {
  47. WIKI.logger.warn(err)
  48. }
  49. })
  50. this.strategies[strategy.key] = strategy
  51. WIKI.logger.info(`Authentication Provider ${strategy.title}: [ OK ]`)
  52. })
  53. return this
  54. }
  55. }