auth.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. const passport = require('passport')
  2. const fs = require('fs-extra')
  3. const _ = require('lodash')
  4. const path = require('path')
  5. /* global WIKI */
  6. module.exports = {
  7. strategies: {},
  8. init() {
  9. this.passport = passport
  10. // Serialization user methods
  11. passport.serializeUser(function (user, done) {
  12. done(null, user.id)
  13. })
  14. passport.deserializeUser(function (id, done) {
  15. WIKI.db.users.query().findById(id).then((user) => {
  16. if (user) {
  17. done(null, user)
  18. } else {
  19. done(new Error(WIKI.lang.t('auth:errors:usernotfound')), null)
  20. }
  21. return true
  22. }).catch((err) => {
  23. done(err, null)
  24. })
  25. })
  26. return this
  27. },
  28. async activateStrategies() {
  29. try {
  30. // Unload any active strategies
  31. WIKI.auth.strategies = {}
  32. const currentStrategies = _.keys(passport._strategies)
  33. _.pull(currentStrategies, 'session')
  34. _.forEach(currentStrategies, stg => { passport.unuse(stg) })
  35. // Load enabled strategies
  36. const enabledStrategies = await WIKI.db.authentication.getStrategies()
  37. for (let idx in enabledStrategies) {
  38. const stg = enabledStrategies[idx]
  39. if (!stg.isEnabled) { continue }
  40. const strategy = require(`../modules/authentication/${stg.key}/authentication.js`)
  41. stg.config.callbackURL = `${WIKI.config.host}/login/${stg.key}/callback` // TODO: config.host
  42. strategy.init(passport, stg.config)
  43. fs.readFile(path.join(WIKI.ROOTPATH, `assets/svg/auth-icon-${strategy.key}.svg`), 'utf8').then(iconData => {
  44. strategy.icon = iconData
  45. }).catch(err => {
  46. if (err.code === 'ENOENT') {
  47. strategy.icon = '[missing icon]'
  48. } else {
  49. WIKI.logger.warn(err)
  50. }
  51. })
  52. WIKI.auth.strategies[stg.key] = strategy
  53. WIKI.logger.info(`Authentication Strategy ${stg.title}: [ OK ]`)
  54. }
  55. } catch (err) {
  56. WIKI.logger.error(`Authentication Strategy: [ FAILED ]`)
  57. WIKI.logger.error(err)
  58. }
  59. }
  60. }