node package manager


Flatiron plugin for user authentication with Mozilla Persona

Flatiron Persona

Broadway plugin for user authentication using Mozilla Persona

Get it with:

npm install flatiron-persona
flatiron = require 'flatiron'
persona  = require 'flatiron-persona'
connect  = require "connect"
app      =;
app.use flatiron.plugins.http
app.use personaaudience: ""
# You need session. Session needs cookieParser. So: 
app.http.before.push do connect.cookieParser
app.http.before.push connect.session secret: "
  Kiedy nikogo nie ma w domu, Katiusza maluje pazury na zielono i śmieje się po cichu do lustra. To prawda!"
app.start 4000;

If you use Creamer like I do, that's what your views/ might look like:

module.exports = ->
    If user is logged in @session.username will be set to his e-mail address.
    Let's make a convenient shortcut.
  if @session?.username? then @username = @session.username
  doctype 5
  html ->
    head ->
      title "Persona authentication demo"
      meta charset: "utf-8"
      meta "http-equiv": "X-UA-Compatible"content: "IE=Edge"
      script src: ""
      # I'll use jquery here. You don't have to. 
      script src: ""
      script src: ""
    # data-username indicates that user is logged in - see below. Again, you can take different approach. 
    body "data-username": @username->
      header ->
        h1 "Persona authentication demo"
        unless @username # if not logged in... 
          a {
            id: "signin"
            href: "#"
            class: "persona-button dark"
          }->  span "Log in"
          a {
            id: "signout"
            href: "#"
            class: "persona-button blue"
          }->  span "Logout #{@username}"
      section id: "main"->
        do content
      footer ->
        p "A juicy footer is here as well :)"
      coffeescript ->
        (document).ready ->
          # That's why we had to set data-username on body - this script will be compiled into JS and won't have access to outside variables like @session. 
          username = ("body").data "username" ? null
          if username then console.log "Logged in as #{username}"
          else console.log "Not logged in (yet?)"
          # Now goes Persona stuff, see 
            loggedInUser: username
            onlogin     : (assertion) ->
              console.log "Logging in..."
              $.ajax {
                type  : "POST"
                url   : "/auth/login"
                data  : 
                  assertion : assertion
                success : -> do window.location.reload
                error   : (xhr, status, error) -> 
                  console.dir xhr
            onlogout    : ->
              console.log "Logging out..."
              $.ajax {
                type  : "POST"
                url   : "/auth/logout"
                success : -> do window.location.reload
                error   : (xhr, status, error) -> console.error "Logout failed: #{error}"
          ("#signin").click  -> do
          ("#signout").click -> do

When calling app.use persona you can provide following options:

BrowserID audience (ie. your application url). There's no default value and you must provide this option. See for more details.
Route prefix, defaults to /auth
  • Tests (preferably in Mocha)
  • Examples