login.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. const config = require("../config.js")
  2. ,Slack = require("../src/slack.js").Slack
  3. ,GoogleOAuth = require("../src/googleOAuth.js").GoogleOAuth
  4. ,FacebookOAuth = require("../src/facebookOAuth.js").FacebookOAuth
  5. ,slackManager = require("../src/slackManager.js").SlackManager
  6. ,accountManager = require("../src/accounts.js").accountManager
  7. ,sessionManager = require("../src/session.js").SessionManager
  8. ,templates = require('./_templates.js');
  9. function checkTokens(service, req, cb) {
  10. switch (service) {
  11. case "slack":
  12. if (req.urlObj.queryTokens.code) {
  13. Slack.getUserId(req.urlObj.queryTokens.code, config.login.slack.redirect_uri, (id) => {
  14. if (id) {
  15. accountManager.fromSlackIdAuth(id, (account) => {
  16. if (account) {
  17. cb(account);
  18. } else {
  19. var account = accountManager.createAccount();
  20. account.authSlackUserEmailAndTeam = id;
  21. accountManager.save(account, () => { cb(account); });
  22. }
  23. });
  24. } else {
  25. cb(null);
  26. }
  27. });
  28. } else {
  29. cb(null);
  30. }
  31. break;
  32. case "google":
  33. if (req.urlObj.queryTokens.code) {
  34. GoogleOAuth.getUserId(req.urlObj.queryTokens.code, (id) => {
  35. if (id) {
  36. accountManager.fromGoogleIdAuth(id, (account) => {
  37. if (account) {
  38. cb(account);
  39. } else {
  40. var account = accountManager.createAccount();
  41. account.authGoogleUserId = id;
  42. accountManager.save(account);
  43. accountManager.save(account, () => { cb(account); });
  44. }
  45. });
  46. } else {
  47. cb(null);
  48. }
  49. });
  50. } else {
  51. cb(null);
  52. }
  53. break;
  54. case "facebook":
  55. if (req.urlObj.queryTokens.code) {
  56. FacebookOAuth.getUserId(req.urlObj.queryTokens.code[0], (id) => {
  57. if (id) {
  58. accountManager.fromFacebookIdAuth(id, (account) => {
  59. if (account) {
  60. cb(account);
  61. } else {
  62. var account = accountManager.createAccount();
  63. account.authFacebookUserId = id;
  64. accountManager.save(account, () => { cb(account); });
  65. }
  66. });
  67. } else {
  68. cb(null);
  69. }
  70. });
  71. } else {
  72. cb(null);
  73. }
  74. break;
  75. default:
  76. cb(null);
  77. break;
  78. }
  79. }
  80. function makeLoginPage() {
  81. const
  82. slackUri = config.login.slack.requestLoginUri
  83. +"?client_id=" +config.login.slack.clientId
  84. +"&scope=" +slackManager.getAuthScope().join(',')
  85. +"&redirect_uri=" +config.login.slack.redirect_uri,
  86. googleUri = config.login.google.requestLoginUri
  87. +"?client_id=" +config.login.google.clientId
  88. +"&scope=" +(["openid", "email", "profile"]).join("%20")
  89. +"&redirect_uri=" +config.login.google.redirect_uri
  90. +"&response_type=code"
  91. facebookUri = config.login.facebook.requestLoginUri
  92. +"?client_id=" +config.login.facebook.clientId
  93. +"&redirect_uri=" +config.login.facebook.redirect_uri;
  94. return templates.header("Mimou - login", ["login.css"])
  95. +`<div class="services"><h1>Login</h1>`
  96. +`<a href="${googleUri}"><img src="https://developers.google.com/identity/images/btn_google_signin_light_normal_web.png" alt="Sign in with Google" class="attempt-right"></a>`
  97. +`<a href="${facebookUri}"><img src="${config.rootUrl}btn_facebook_connect.png" alt="Log in with facebook"/></a>`
  98. +`<a href="${slackUri}"><img src="https://platform.slack-edge.com/img/sign_in_with_slack.png" srcset="https://platform.slack-edge.com/img/sign_in_with_slack.png 1x, https://platform.slack-edge.com/img/sign_in_with_slack@2x.png 2x" /></a>`
  99. +`</div>`
  100. +templates.footer();
  101. }
  102. module.exports.match = function(url) {
  103. if (url.urlParts.length === 1) {
  104. return true;
  105. } else if (url.urlParts.length === 2 && Object.keys(config.login).indexOf(url.urlParts[1]) >= 0) {
  106. return true;
  107. }
  108. return false;
  109. };
  110. module.exports.exec = function(req, res) {
  111. if (!req.urlObj.urlParts[1]) {
  112. res.end(makeLoginPage());
  113. } else {
  114. checkTokens(req.urlObj.urlParts[1], req, (account) => {
  115. if (account) {
  116. req.account = account;
  117. req.session = sessionManager.lazyForRequest(req);
  118. req.session.setAccountId(req.reqT, account.id);
  119. res.writeHeader("302", {
  120. Location: config.rootUrl
  121. ,"Set-Cookie": "sessID="+req.session.sessId
  122. });
  123. sessionManager.saveSession(req.session);
  124. res.end();
  125. } else {
  126. res.end(makeLoginPage());
  127. }
  128. });
  129. }
  130. };
  131. module.exports.needLogin = false;