AuthenticationManager.coffee 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. User = require("../../models/User").User
  2. {db, ObjectId} = require("../../infrastructure/mongojs")
  3. crypto = require 'crypto'
  4. bcrypt = require 'bcrypt'
  5. module.exports = AuthenticationManager =
  6. authenticate: (query, password, callback = (error, user) ->) ->
  7. # Using Mongoose for legacy reasons here. The returned User instance
  8. # gets serialized into the session and there may be subtle differences
  9. # between the user returned by Mongoose vs mongojs (such as default values)
  10. User.findOne query, (error, user) =>
  11. return callback(error) if error?
  12. if user?
  13. if user.hashedPassword?
  14. bcrypt.compare password, user.hashedPassword, (error, match) ->
  15. return callback(error) if error?
  16. if match
  17. callback null, user
  18. else
  19. callback null, null
  20. else
  21. callback null, null
  22. else
  23. callback null, null
  24. setUserPassword: (user_id, password, callback = (error) ->) ->
  25. bcrypt.genSalt 7, (error, salt) ->
  26. return callback(error) if error?
  27. bcrypt.hash password, salt, (error, hash) ->
  28. return callback(error) if error?
  29. db.users.update({
  30. _id: ObjectId(user_id.toString())
  31. }, {
  32. $set: hashedPassword: hash
  33. $unset: password: true
  34. }, callback)
  35. getAuthToken: (user_id, callback = (error, auth_token) ->) ->
  36. db.users.findOne { _id: ObjectId(user_id.toString()) }, { auth_token : true }, (error, user) =>
  37. return callback(error) if error?
  38. return callback(new Error("user could not be found: #{user_id}")) if !user?
  39. if user.auth_token?
  40. callback null, user.auth_token
  41. else
  42. @_createSecureToken (error, auth_token) ->
  43. db.users.update { _id: ObjectId(user_id.toString()) }, { $set : auth_token: auth_token }, (error) ->
  44. return callback(error) if error?
  45. callback null, auth_token
  46. _createSecureToken: (callback = (error, token) ->) ->
  47. crypto.randomBytes 48, (error, buffer) ->
  48. return callback(error) if error?
  49. callback null, buffer.toString("hex")