login.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const config = require("../config.js")
  2. ,Slack = require("../src/slack.js").Slack
  3. ,GoogleOAuth = require("../src/googleOAuth.js").GoogleOAuth
  4. ,slackManager = require("../src/slackManager.js").SlackManager
  5. ,accountManager = require("../src/accounts.js").accountManager
  6. ,templates = require('./_templates.js');
  7. function checkTokens(service, req, cb) {
  8. switch (service) {
  9. case "slack":
  10. if (req.urlObj.queryTokens.code) {
  11. Slack.getUserMail(req.urlObj.queryTokens.code, config.login.slack.redirect_uri, (email) => {
  12. if (email) {
  13. console.log("from slack email " +email);
  14. var account = accountManager.fromSlackEmailAuth(email);
  15. cb(account);
  16. } else {
  17. cb(null);
  18. }
  19. });
  20. } else {
  21. cb(null);
  22. }
  23. break;
  24. case "google":
  25. if (req.urlObj.queryTokens.code) {
  26. GoogleOAuth.getUserMail(req.urlObj.queryTokens.code, (id) => {
  27. if (id) {
  28. console.log("from google id " +id);
  29. var account = accountManager.fromGoogleIdAuth(id);
  30. cb(account);
  31. } else {
  32. cb(null);
  33. }
  34. });
  35. } else {
  36. cb(null);
  37. }
  38. break;
  39. default:
  40. cb(null);
  41. break;
  42. }
  43. }
  44. function makeLoginPage() {
  45. const
  46. slackUri = config.login.slack.endpoint
  47. +"?client_id=" +config.login.slack.clientId
  48. +"&scope=" +slackManager.getAuthScope().join(',')
  49. +"&redirect_uri=" +config.login.slack.redirect_uri,
  50. googleUri = config.login.google.endpoint
  51. +"?client_id=" +config.login.google.clientId
  52. +"&scope=" +(["openid", "email", "profile"]).join("%20")
  53. +"&redirect_uri=" +config.login.google.redirect_uri
  54. +"&response_type=code";
  55. return templates.header("Mimou - login", ["login.css"])
  56. +`<div class="services"><h1>Login</h1>`
  57. +`<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>`
  58. +`<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>`
  59. +`</div>`
  60. +templates.footer();
  61. }
  62. module.exports.match = function(url) {
  63. if (url.urlParts.length === 1) {
  64. return true;
  65. } else if (url.urlParts.length === 2 && Object.keys(config.login).indexOf(url.urlParts[1]) >= 0) {
  66. return true;
  67. }
  68. return false;
  69. };
  70. module.exports.exec = function(req, res) {
  71. if (!req.urlObj.urlParts[1]) {
  72. res.end(makeLoginPage());
  73. } else {
  74. checkTokens(req.urlObj.urlParts[1], req, (account) => {
  75. if (account) {
  76. req.account = account;
  77. req.session = sessionManager.lazyForRequest(req);
  78. req.session.setSlackToken(req.reqT, token);
  79. res.writeHeader("302", {
  80. Location: config.rootUrl
  81. ,"Set-Cookie": "sessID="+req.session.sessId
  82. });
  83. sessionManager.saveSession(req.session);
  84. res.end();
  85. } else {
  86. res.end(makeLoginPage());
  87. }
  88. });
  89. }
  90. };
  91. module.exports.needLogin = false;