login.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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, () => { cb(account); });
  43. }
  44. });
  45. } else {
  46. cb(null);
  47. }
  48. });
  49. } else {
  50. cb(null);
  51. }
  52. break;
  53. case "facebook":
  54. if (req.urlObj.queryTokens.code) {
  55. FacebookOAuth.getUserId(req.urlObj.queryTokens.code[0], (id) => {
  56. if (id) {
  57. accountManager.fromFacebookIdAuth(id, (account) => {
  58. if (account) {
  59. cb(account);
  60. } else {
  61. var account = accountManager.createAccount();
  62. account.authFacebookUserId = id;
  63. accountManager.save(account, () => { cb(account); });
  64. }
  65. });
  66. } else {
  67. cb(null);
  68. }
  69. });
  70. } else {
  71. cb(null);
  72. }
  73. break;
  74. default:
  75. cb(null);
  76. break;
  77. }
  78. }
  79. function makeLoginPage() {
  80. const
  81. slackUri = config.login.slack.requestLoginUri
  82. +"?client_id=" +config.login.slack.clientId
  83. +"&scope=" +slackManager.getAuthScope().join(',')
  84. +"&redirect_uri=" +config.login.slack.redirect_uri,
  85. googleUri = config.login.google.requestLoginUri
  86. +"?client_id=" +config.login.google.clientId
  87. +"&scope=" +(["openid", "email", "profile"]).join("%20")
  88. +"&redirect_uri=" +config.login.google.redirect_uri
  89. +"&response_type=code"
  90. facebookUri = config.login.facebook.requestLoginUri
  91. +"?client_id=" +config.login.facebook.clientId
  92. +"&redirect_uri=" +config.login.facebook.redirect_uri;
  93. return templates.header("Mimou - login", ["login.css"])
  94. +`<div class="services"><h1>Login</h1>`
  95. +`<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>`
  96. +`<a href="${facebookUri}"><img src="${config.rootUrl}btn_facebook_connect.png" alt="Log in with facebook"/></a>`
  97. +`<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>`
  98. +`</div>`
  99. +templates.footer();
  100. }
  101. module.exports.match = function(url) {
  102. if (url.urlParts.length === 1) {
  103. return true;
  104. } else if (url.urlParts.length === 2 && Object.keys(config.login).indexOf(url.urlParts[1]) >= 0) {
  105. return true;
  106. }
  107. return false;
  108. };
  109. module.exports.exec = function(req, res) {
  110. if (!req.urlObj.urlParts[1]) {
  111. res.end(makeLoginPage());
  112. } else {
  113. checkTokens(req.urlObj.urlParts[1], req, (account) => {
  114. if (account) {
  115. req.account = account;
  116. req.session = sessionManager.lazyForRequest(req);
  117. req.session.setAccountId(req.reqT, account.id);
  118. res.writeHeader("302", {
  119. Location: config.rootUrl
  120. ,"Set-Cookie": "sessID="+req.session.sessId
  121. });
  122. sessionManager.saveSession(req.session);
  123. res.end();
  124. } else {
  125. res.end(makeLoginPage());
  126. }
  127. });
  128. }
  129. };
  130. module.exports.needLogin = false;