Skip to content

Instantly share code, notes, and snippets.

@jda0
Last active April 19, 2018 19:24
Show Gist options
  • Save jda0/38bc384a71f4b310e62e to your computer and use it in GitHub Desktop.
Save jda0/38bc384a71f4b310e62e to your computer and use it in GitHub Desktop.
# 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