Last active
April 19, 2018 19:24
-
-
Save jda0/38bc384a71f4b310e62e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# required in process.env: host, cloudant_account, cloudant_key, cloudant_pass, | |
# cloudant_db_accounts, cloudant_db_data, cookie_secret, redis_url, redis_port, redis_path, | |
# smtp_email, smtp_pass, smtp_host, smtp_ssl | |
bodyParser = require 'body-parser' | |
cloudant = require 'cloudant' account: process.env.cloudant_account, | |
key: process.env.cloudant_key, | |
password: process.env.cloudant_pass | |
email = require 'email' | |
express = require 'express' () | |
flash = require 'connect-flash' | |
passwordless = require 'passwordless' | |
redisStore = require 'passwordless-redisstore' | |
session = require 'express-session' | |
smtpSettings = | |
user: process.env.smtp_email | |
, password: process.env.smtp_pass | |
, host: process.env.smtp_host | |
, ssl: process.env.smtp_ssl | |
smtp = email.server.connect smtpSettings | |
passwordless.init new redisStore process.env.redis_port | |
, process.env.redis_url | |
, auth_pass: process.env.redis_pass | |
passwordless.addDelivery (token, uid, recipient, cb) -> | |
greeting = if uid? then 'Welcome back!' else 'Welcome!' | |
smtp.send | |
from: smtpSettings.user | |
to: recipient | |
subject: "nco :: #{greeting}" | |
text: "#{greeting}\n\nFollow this link to login: | |
https://#{host}/?token=#{token}&uid=#{encodeURIComponent(uid)}" | |
, (e, message) -> | |
if e then console.error 'SMTP Error', e | |
cb e | |
app.use bodyparser.json() | |
app.use bodyparser.urlencoded() | |
app.use session secret: process.env.cookie_secret | |
app.use passwordless.sessionSupport() | |
app.use flash() | |
app.get '/', passwordless.acceptToken successRedirect: '/authportal' | |
, failureFlash: 'There was a problem authenticating your token' | |
, failureRedirect: '/login' | |
app.get '/', (req, res) -> | |
if res.session.profile and res.session.profile.authed | |
app.redirect '/app' | |
else if res.session.profile | |
app.redirect '/unauthed' | |
else | |
app.redirect '/login' | |
app.get '/login', (req, res) -> | |
res.render 'login', errors: req.flash 'passwordless' | |
app.post '/sendtoken' | |
, passwordless.requestToken (user, delivery, cb) -> cb null, user | |
, (req, res) -> | |
res.render 'tokensent' | |
getUser = (id) -> | |
accounts = cloudant.use process.env.cloudant_db_accounts | |
accounts.get req.user, (e, body) -> | |
if e and e.error is 'not_found' | |
return null | |
else if e | |
console.error 'Cloudant Error', e.error | |
return error: e | |
else | |
return user: body | |
app.get '/authportal', (req, res) -> | |
user = getUser req.user | |
if not user | |
res.redirect '/register' | |
else if user.error | |
res.flash 'passwordless', -> errors.push 'There was a problem fetching your profile' | |
errors | |
res.redirect '/login' | |
else | |
res.session.profile = user | |
if user.authed | |
res.redirect '/app' | |
else | |
res.redirect '/unauthed' | |
app.post '/authportal', (req, res) -> | |
if req.body.id and req.body.name and req.body.rank | |
accounts = cloudant.use process.env.cloudant_db_accounts | |
accounts.insert | |
else | |
res.redirect '/register' | |
app.get '/register', (req, res) -> | |
res.render 'register', errors: req.flash 'passwordless' | |
app.get '/unauthed', (req, res) -> | |
res.render 'unauthed' | |
app.use '/static', express.static 'public' | |
app.listen process.env.PORT || 3000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment