SlideShare a Scribd company logo
Building Persona
               federated & privacy-sensitive
               identity for the web




François Marier – @fmarier
solving the
password problem
   on the web
users: reduce number of passwords
users: reduce number of passwords

developers: reduce implementation costs
X
Username:
francois


Password:
****************



                   Sign in
security
bcrypt

per-user salt

site secret

password & lockout policies

secure recovery
bcrypt

per-user salt

site secret

password & lockout policies

secure recovery
bcrypt

per-user salt

site secret

password & lockout policies

secure recovery
bcrypt

per-user salt

site secret

password & lockout policies

secure recovery
bcrypt

per-user salt

site secret

password & lockout policies

secure recovery
bcrypt


      0 1 3
    2
per-user salt

               o  rd
site secret
         s s w         s
   p  a & lockoutne
                li policies
password
           id e
      g u
secure recovery
ALTER TABLE user
DROP COLUMN password;
existing solutions
client certificates
“social” authentication
“People want a little
dating before marriage.”
       Eric Vishria – Rockmelt
so...




        storing passwords is hard
so...




        storing passwords is hard

        no suitable alternatives
decentralized
decentralized
                privacy-sensitive
decentralized
                privacy-sensitive




      simple
decentralized
                privacy-sensitive




      simple
                   open source
in your browser
how does it work?
francois@mozilla.com
<digital signatures 101>
private   public
public
My name is
François Marier
and my email is
too long to fit
on one line.
My name is
          François Marier
          and my email is
          too long to fit
          on one line.
private
My name is
François Marier
and my email is
too long to fit
on one line.
                  public
sign   verify
</digital signatures 101>
francois@mozilla.com
getting a proof of email ownership
authenticate?
authenticate?


 public key
authenticate?


   public key


signed public key
you have a signed statement from your
provider that you own your email address
logging into a 3rd party site
assertion

         linux.conf.au

Valid for:   2 minutes
assertion

         linux.conf.au

Valid for:   2 minutes


check audience
assertion

         linux.conf.au

Valid for:   2 minutes


check audience
check expiry
assertion

         linux.conf.au

Valid for:   2 minutes


check audience
check expiry
check signature
assertion




  public key
                            linux.conf.au

               Valid for:         2 minutes
assertion




                         linux.conf.au

            Valid for:         2 minutes
assertion


session cookie
achieving
that vision
email providers

browser vendors
email providers
fmarier@gmail.com
fmarier@gmail.com
fallback identity provider
persona.org account
support for all email providers
browser vendors
navigator.id.*
js
support for all
modern browsers


       >= 8
support for all
modern browsers


       >= 8
live demo
using it on your site
(     no need to take notes
    these slides will be online   )
<script src=”https://login.persona.org/include.js”>
</script>
</body></html>
navigator.id.watch({
    loggedInEmail: “francois@mozilla.com”,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                // do something
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
navigator.id.watch({
    loggedInUser: “francois@mozilla.com”,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                // do something
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
navigator.id.watch({
    loggedInUser: null,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                // do something
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
navigator.id.watch({
    loggedInUser: null,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                // do something
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
navigator.id.watch({
    loggedInUser: null,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                window.location = '/';
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
navigator.id.request()
navigator.id.watch({
    loggedInUser: null,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                window.location = '/';
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
navigator.id.watch({
    loggedInUser: null,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                window.location = '/home';
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
def verify_assertion(assertion):

  page = requests.post(
    'https://verifier.login.persona.org/verify',
    Data={ "assertion": assertion,
           "audience": 'http://123done.org'})

  data = page.json
  return data.status == 'okay'
def verify_assertion(assertion):

  page = requests.post(
    'https://verifier.login.persona.org/verify',
    Data={ "assertion": assertion,
           "audience": 'http://123done.org'})

  data = page.json
  return data.status == 'okay'
{
    status: “okay”,

    audience: “http://123done.org”,

    expires: 1344849682560,

    email: “francois@mozilla.com”,

    issuer: “login.persona.org”
}
{
    status: “failed”,

    reason: “assertion has expired”
}
navigator.id.logout()
navigator.id.watch({
    loggedInUser: null,
    onlogin: function (assertion) {
        $.post('/login',
            {assertion: assertion},
            function (data) {
                window.location = '/home';
            }
        );
    },
    onlogout: function () {
        window.location = '/logout';
    }
});
1. load javascript library
1. load javascript library

2. setup login & logout callbacks
1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons
1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

4. verify proof of ownership
function do_login() {
<?php
                                                                           navigator.id.request();
                                                                       }
if (!empty($_POST)) {
                                                                       function do_logout() {
    $result = verify_assertion($_POST['assertion']);
                                                                           navigator.id.logout();
    if ($result->status === 'okay') {
                                                                       }
         print_header();
         echo "<p>Logged in as: " . $result->email . "</p>";
                                                                       navigator.id.watch({
         echo '<p><a href="javascript:do_logout()">Logout</a></p>';
                                                                            loggedInUser: $email,
         print_backLink();
                                                                            onlogin: function (assertion) {
         print_footer($result->email);                                          alert("onlogin: $email");
    } else {
                                                                                var assertion_field =
         print_header();
                                                                                  document.getElementById("assertion-field");
         echo "<p>Error: " . $result->reason . "</p>";                          assertion_field.value = assertion;
         print_backLink();
                                                                                var login_form = document.getElementById("login-form");
         print_footer();
                                                                                login_form.submit();
    }                                                                       },
} elseif (!empty($_GET['logout'])) {
                                                                            onlogout: function () {
    print_header();
                                                                                alert("onlogout: $email");
    echo "<p>You have logged out.</p>";
                                                                                window.location = '?logout=1';
    print_backLink();
                                                                            }
    print_footer();
                                                                       });
} else {
                                                                       </script></body></html>
    print_header();
                                                                       EOF;
    echo "<p><a href="javascript:do_login()">Login</a></p>";
                                                                       }
    print_footer();
}
                                                                       function verify_assertion($assertion) {
                                                                           $audience = ($_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://')
function print_header() {
                                                                              . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'];
     echo <<<EOF                                                           $postdata = 'assertion=' . urlencode($assertion) . '&audience='
<!DOCTYPE html><html><head><meta charset="utf-8"></head>
                                                                             . urlencode($audience);
<body>
<form id="login-form" method="POST">                                        $ch = curl_init();
<input id="assertion-field" type="hidden" name="assertion" value="">
                                                                            curl_setopt($ch, CURLOPT_URL,
</form>
                                                                              "https://verifier.login.persona.org/verify");
EOF;                                                                        curl_setopt($ch, CURLOPT_POST, true);
}
                                                                            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                                                            curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
function print_backLink() {
                                                                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    echo "<p><a href="persona.php">Back to login page</a></p>";
                                                                            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
}
                                                                            $json = curl_exec($ch);
                                                                            curl_close($ch);
function print_footer($email = 'null') {
    if ($email !== 'null') {
                                                                            $res = json_decode($json);
         $email = "'$email'";
                                                                            $res->status = 'okay';
    }
                                                                            $res->email = 'francois@mozilla.com';
    echo <<<EOF
                                                                            return $res;
<script src="http://127.0.0.1:10002/include.orig.js"></script>
                                                                       }
<script>                                                               ?>
wanna help us
     solve the
password problem?
add Persona to
your project/site

tell us about your
       experience

   email one site
     asking for it
add Persona to
your project/site

tell us about your
       experience

   email one site
     asking for it
add Persona to
your project/site

tell us about your
       experience

   email one site
     asking for it
To learn more about Persona:
https://login.persona.org/
http://identity.mozilla.com/

https://developer.mozilla.org/docs/Persona/Why_Persona
https://developer.mozilla.org/docs/Persona/Quick_Setup

https://github.com/mozilla/browserid-cookbook
https://developer.mozilla.org/docs/Persona/Libraries_and_plugins

http://123done.org/
https://wiki.mozilla.org/Identity#Get_Involved




@fmarier                            http://fmarier.org
Who's using Persona?
identity provider API

https://eyedee.me/.well-known/browserid:
{
    "public-key": {
       "algorithm":"RS",
       "n":"8606...",
       "e":"65537"
    },
    "authentication": "/browserid/sign_in.html",
    "provisioning": "/browserid/provision.html"
}
identity provider API

https://eyedee.me/.well-known/browserid:
{
    "public-key": {
       "algorithm":"RS",
       "n":"8606...",
       "e":"65537"
    },
    "authentication": "/browserid/sign_in.html",
    "provisioning": "/browserid/provision.html"
}
identity provider API

https://eyedee.me/.well-known/browserid:
{
    "public-key": {
       "algorithm":"RS",
       "n":"8606...",
       "e":"65537"
    },
    "authentication": "/browserid/sign_in.html",
    "provisioning": "/browserid/provision.html"
}
identity provider API

https://eyedee.me/.well-known/browserid:
{
    "public-key": {
       "algorithm":"RS",
       "n":"8606...",
       "e":"65537"
    },
    "authentication": "/browserid/sign_in.html",
    "provisioning": "/browserid/provision.html"
}
identity provider API

https://eyedee.me/.well-known/browserid:
{
    "public-key": {
       "algorithm":"RS",
       "n":"8606...",
       "e":"65537"
    },
    "authentication": "/browserid/sign_in.html",
    "provisioning": "/browserid/provision.html"
}
identity provider API

1. check for your /.well-known/browserid

2. try the provisioning endpoint

3. show the authentication page

4. call the provisioning endpoint again
identity provider API

1. check for your /.well-known/browserid

2. try the provisioning endpoint

3. show the authentication page

4. call the provisioning endpoint again
identity provider API

1. check for your /.well-known/browserid

2. try the provisioning endpoint

3. show the authentication page

4. call the provisioning endpoint again
identity provider API

1. check for your /.well-known/browserid

2. try the provisioning endpoint

3. show the authentication page

4. call the provisioning endpoint again
Photo credits:
Top 500 passwords: http://xato.net/passwords/more-top-worst-passwords/

Parchment: https://secure.flickr.com/photos/27613359@N03/6750396225/

Elephant in room: https://secure.flickr.com/photos/bitboy/246805948/

Cookie on tray: https://secure.flickr.com/photos/jamisonjudd/4810986199/

Uncle Sam: https://secure.flickr.com/photos/donkeyhotey/5666065982/

Danish passport: https://en.wikipedia.org/wiki/File:DK_Passport_Cover.jpg

Restaurant dinner: https://secure.flickr.com/photos/yourdon/3977084094/

                © 2013 François Marier <francois@mozilla.com>
                This work is licensed under a
                Creative Commons Attribution-ShareAlike 3.0 New Zealand License.

More Related Content

What's hot

DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQuery
Remy Sharp
 
Symfony CoP: Form component
Symfony CoP: Form componentSymfony CoP: Form component
Symfony CoP: Form component
Samuel ROZE
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
eugenio pombi
 
HirshHorn theme: how I created it
HirshHorn theme: how I created itHirshHorn theme: how I created it
HirshHorn theme: how I created it
Paul Bearne
 
How I started to love design patterns
How I started to love design patternsHow I started to love design patterns
How I started to love design patterns
Samuel ROZE
 
Django quickstart
Django quickstartDjango quickstart
Django quickstart
Marconi Moreto
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
Hugo Hamon
 
Coding website
Coding websiteCoding website
Coding website
PutuMahendra Wijaya
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
Hugo Hamon
 
Emmet cheat-sheet
Emmet cheat-sheetEmmet cheat-sheet
Emmet cheat-sheet
Jean Pierre Portocarrero
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
Hugo Hamon
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuery
sergioafp
 
Command-Oriented Architecture
Command-Oriented ArchitectureCommand-Oriented Architecture
Command-Oriented Architecture
Luiz Messias
 
Functionality Focused Code Organization
Functionality Focused Code OrganizationFunctionality Focused Code Organization
Functionality Focused Code Organization
Rebecca Murphey
 
Presentation1
Presentation1Presentation1
Presentation1
Rahadyan Gusti
 
YAP / Open Mail Overview
YAP / Open Mail OverviewYAP / Open Mail Overview
YAP / Open Mail Overview
Jonathan LeBlanc
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
Guilherme Blanco
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Facebook
FacebookFacebook
Migrare da symfony 1 a Symfony2
 Migrare da symfony 1 a Symfony2  Migrare da symfony 1 a Symfony2
Migrare da symfony 1 a Symfony2
Massimiliano Arione
 

What's hot (20)

DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQuery
 
Symfony CoP: Form component
Symfony CoP: Form componentSymfony CoP: Form component
Symfony CoP: Form component
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
 
HirshHorn theme: how I created it
HirshHorn theme: how I created itHirshHorn theme: how I created it
HirshHorn theme: how I created it
 
How I started to love design patterns
How I started to love design patternsHow I started to love design patterns
How I started to love design patterns
 
Django quickstart
Django quickstartDjango quickstart
Django quickstart
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
Coding website
Coding websiteCoding website
Coding website
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
Emmet cheat-sheet
Emmet cheat-sheetEmmet cheat-sheet
Emmet cheat-sheet
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuery
 
Command-Oriented Architecture
Command-Oriented ArchitectureCommand-Oriented Architecture
Command-Oriented Architecture
 
Functionality Focused Code Organization
Functionality Focused Code OrganizationFunctionality Focused Code Organization
Functionality Focused Code Organization
 
Presentation1
Presentation1Presentation1
Presentation1
 
YAP / Open Mail Overview
YAP / Open Mail OverviewYAP / Open Mail Overview
YAP / Open Mail Overview
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Facebook
FacebookFacebook
Facebook
 
Migrare da symfony 1 a Symfony2
 Migrare da symfony 1 a Symfony2  Migrare da symfony 1 a Symfony2
Migrare da symfony 1 a Symfony2
 

Similar to Building Persona: federated and privacy-sensitive identity for the Web (Open Source Days 2013)

Passwords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answerPasswords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answer
Francois Marier
 
Persona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwordsPersona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwords
Francois Marier
 
Mashing up JavaScript
Mashing up JavaScriptMashing up JavaScript
Mashing up JavaScript
Bastian Hofmann
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Bastian Hofmann
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
Michael Girouard
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
Jonathan Wage
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
rajivmordani
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ Etsy
Nishan Subedi
 
WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015
Fernando Daciuk
 
Authenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsAuthenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIs
Jimmy Guerrero
 
17. CodeIgniter login simplu cu sesiuni
17. CodeIgniter login simplu cu sesiuni17. CodeIgniter login simplu cu sesiuni
17. CodeIgniter login simplu cu sesiuni
Razvan Raducanu, PhD
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
Konstantin Kudryashov
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful Security
Ryan Weaver
 
Php if
Php ifPhp if
Form demoinplaywithmysql
Form demoinplaywithmysqlForm demoinplaywithmysql
Form demoinplaywithmysql
Knoldus Inc.
 
jQuery secrets
jQuery secretsjQuery secrets
jQuery secrets
Bastian Feder
 
jQuery secrets
jQuery secretsjQuery secrets
jQuery secrets
Bastian Feder
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Ryan Weaver
 
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe KyivKISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
Grossum
 
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe KyivKISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
Grossum Software Outsourcing
 

Similar to Building Persona: federated and privacy-sensitive identity for the Web (Open Source Days 2013) (20)

Passwords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answerPasswords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answer
 
Persona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwordsPersona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwords
 
Mashing up JavaScript
Mashing up JavaScriptMashing up JavaScript
Mashing up JavaScript
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ Etsy
 
WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015
 
Authenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsAuthenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIs
 
17. CodeIgniter login simplu cu sesiuni
17. CodeIgniter login simplu cu sesiuni17. CodeIgniter login simplu cu sesiuni
17. CodeIgniter login simplu cu sesiuni
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful Security
 
Php if
Php ifPhp if
Php if
 
Form demoinplaywithmysql
Form demoinplaywithmysqlForm demoinplaywithmysql
Form demoinplaywithmysql
 
jQuery secrets
jQuery secretsjQuery secrets
jQuery secrets
 
jQuery secrets
jQuery secretsjQuery secrets
jQuery secrets
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
 
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe KyivKISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
 
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe KyivKISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
KISS: Keep It Simple Security - Oleg Zinchenko - Symfony Cafe Kyiv
 

More from Francois Marier

Security and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power UsersSecurity and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power Users
Francois Marier
 
Getting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your WebappGetting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your Webapp
Francois Marier
 
Hardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyHardening Firefox for Security and Privacy
Hardening Firefox for Security and Privacy
Francois Marier
 
Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016
Francois Marier
 
Privacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxPrivacy and Tracking Protection in Firefox
Privacy and Tracking Protection in Firefox
Francois Marier
 
Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015
Francois Marier
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScript
Francois Marier
 
URL to HTML
URL to HTMLURL to HTML
URL to HTML
Francois Marier
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScript
Francois Marier
 
Supporting Debian machines for friends and family
Supporting Debian machines for friends and familySupporting Debian machines for friends and family
Supporting Debian machines for friends and family
Francois Marier
 
Outsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianOutsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to Debian
Francois Marier
 
URL to HTML
URL to HTMLURL to HTML
URL to HTML
Francois Marier
 
Easy logins for Ruby web applications
Easy logins for Ruby web applicationsEasy logins for Ruby web applications
Easy logins for Ruby web applications
Francois Marier
 
Easy logins for JavaScript web applications
Easy logins for JavaScript web applicationsEasy logins for JavaScript web applications
Easy logins for JavaScript web applications
Francois Marier
 
You're still using passwords on your site?
You're still using passwords on your site?You're still using passwords on your site?
You're still using passwords on your site?
Francois Marier
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScript
Francois Marier
 
Securing the Web without site-specific passwords
Securing the Web without site-specific passwordsSecuring the Web without site-specific passwords
Securing the Web without site-specific passwords
Francois Marier
 
Easy logins for PHP web applications
Easy logins for PHP web applicationsEasy logins for PHP web applications
Easy logins for PHP web applications
Francois Marier
 
Persona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole WebPersona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole Web
Francois Marier
 
Taking the pain out of signing users in
Taking the pain out of signing users inTaking the pain out of signing users in
Taking the pain out of signing users in
Francois Marier
 

More from Francois Marier (20)

Security and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power UsersSecurity and Privacy settings for Firefox Power Users
Security and Privacy settings for Firefox Power Users
 
Getting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your WebappGetting Browsers to Improve the Security of Your Webapp
Getting Browsers to Improve the Security of Your Webapp
 
Hardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyHardening Firefox for Security and Privacy
Hardening Firefox for Security and Privacy
 
Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016Security and Privacy on the Web in 2016
Security and Privacy on the Web in 2016
 
Privacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxPrivacy and Tracking Protection in Firefox
Privacy and Tracking Protection in Firefox
 
Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015Security and Privacy on the Web in 2015
Security and Privacy on the Web in 2015
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScript
 
URL to HTML
URL to HTMLURL to HTML
URL to HTML
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScript
 
Supporting Debian machines for friends and family
Supporting Debian machines for friends and familySupporting Debian machines for friends and family
Supporting Debian machines for friends and family
 
Outsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianOutsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to Debian
 
URL to HTML
URL to HTMLURL to HTML
URL to HTML
 
Easy logins for Ruby web applications
Easy logins for Ruby web applicationsEasy logins for Ruby web applications
Easy logins for Ruby web applications
 
Easy logins for JavaScript web applications
Easy logins for JavaScript web applicationsEasy logins for JavaScript web applications
Easy logins for JavaScript web applications
 
You're still using passwords on your site?
You're still using passwords on your site?You're still using passwords on your site?
You're still using passwords on your site?
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScript
 
Securing the Web without site-specific passwords
Securing the Web without site-specific passwordsSecuring the Web without site-specific passwords
Securing the Web without site-specific passwords
 
Easy logins for PHP web applications
Easy logins for PHP web applicationsEasy logins for PHP web applications
Easy logins for PHP web applications
 
Persona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole WebPersona: a federated and privacy-protecting login system for the whole Web
Persona: a federated and privacy-protecting login system for the whole Web
 
Taking the pain out of signing users in
Taking the pain out of signing users inTaking the pain out of signing users in
Taking the pain out of signing users in
 

Recently uploaded

Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeckPoznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
FilipTomaszewski5
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
Ivo Velitchkov
 
Principle of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptxPrinciple of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptx
BibashShahi
 
Christine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptxChristine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptx
christinelarrosa
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
Fwdays
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
Fwdays
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
christinelarrosa
 
Day 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio FundamentalsDay 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio Fundamentals
UiPathCommunity
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
Jason Yip
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
Neo4j
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
Alex Pruden
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
Chart Kalyan
 
What is an RPA CoE? Session 2 – CoE Roles
What is an RPA CoE?  Session 2 – CoE RolesWhat is an RPA CoE?  Session 2 – CoE Roles
What is an RPA CoE? Session 2 – CoE Roles
DianaGray10
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
Safe Software
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
ScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking ReplicationScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking Replication
ScyllaDB
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
operationspcvita
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
Miro Wengner
 
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving
 

Recently uploaded (20)

Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeckPoznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
 
Principle of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptxPrinciple of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptx
 
Christine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptxChristine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptx
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
 
Day 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio FundamentalsDay 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio Fundamentals
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
 
What is an RPA CoE? Session 2 – CoE Roles
What is an RPA CoE?  Session 2 – CoE RolesWhat is an RPA CoE?  Session 2 – CoE Roles
What is an RPA CoE? Session 2 – CoE Roles
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
ScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking ReplicationScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking Replication
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
 
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
 

Building Persona: federated and privacy-sensitive identity for the Web (Open Source Days 2013)

  • 1. Building Persona federated & privacy-sensitive identity for the web François Marier – @fmarier
  • 3. users: reduce number of passwords
  • 4. users: reduce number of passwords developers: reduce implementation costs
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15. bcrypt per-user salt site secret password & lockout policies secure recovery
  • 16. bcrypt per-user salt site secret password & lockout policies secure recovery
  • 17. bcrypt per-user salt site secret password & lockout policies secure recovery
  • 18. bcrypt per-user salt site secret password & lockout policies secure recovery
  • 19. bcrypt per-user salt site secret password & lockout policies secure recovery
  • 20. bcrypt 0 1 3 2 per-user salt o rd site secret s s w s p a & lockoutne li policies password id e g u secure recovery
  • 21.
  • 22. ALTER TABLE user DROP COLUMN password;
  • 26. “People want a little dating before marriage.” Eric Vishria – Rockmelt
  • 27.
  • 28. so... storing passwords is hard
  • 29. so... storing passwords is hard no suitable alternatives
  • 30.
  • 32. decentralized privacy-sensitive
  • 33. decentralized privacy-sensitive simple
  • 34. decentralized privacy-sensitive simple open source
  • 36. how does it work?
  • 37.
  • 40. private public
  • 42. My name is François Marier and my email is too long to fit on one line.
  • 43. My name is François Marier and my email is too long to fit on one line. private
  • 44. My name is François Marier and my email is too long to fit on one line. public
  • 45. sign verify
  • 48. getting a proof of email ownership
  • 51. authenticate? public key signed public key
  • 52. you have a signed statement from your provider that you own your email address
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60. logging into a 3rd party site
  • 61. assertion linux.conf.au Valid for: 2 minutes
  • 62. assertion linux.conf.au Valid for: 2 minutes check audience
  • 63. assertion linux.conf.au Valid for: 2 minutes check audience check expiry
  • 64. assertion linux.conf.au Valid for: 2 minutes check audience check expiry check signature
  • 65. assertion public key linux.conf.au Valid for: 2 minutes
  • 66. assertion linux.conf.au Valid for: 2 minutes
  • 69.
  • 75.
  • 76.
  • 77.
  • 79. support for all email providers
  • 82.
  • 83.
  • 84.
  • 85. js
  • 86. support for all modern browsers >= 8
  • 87. support for all modern browsers >= 8
  • 89. using it on your site
  • 90. ( no need to take notes these slides will be online )
  • 91.
  • 93. navigator.id.watch({ loggedInEmail: “francois@mozilla.com”, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; } });
  • 94. navigator.id.watch({ loggedInUser: “francois@mozilla.com”, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; } });
  • 95. navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; } });
  • 96. navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; } });
  • 97. navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/'; } ); }, onlogout: function () { window.location = '/logout'; } });
  • 98.
  • 100.
  • 101.
  • 102.
  • 103. navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/'; } ); }, onlogout: function () { window.location = '/logout'; } });
  • 104. navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; } });
  • 105. def verify_assertion(assertion): page = requests.post( 'https://verifier.login.persona.org/verify', Data={ "assertion": assertion, "audience": 'http://123done.org'}) data = page.json return data.status == 'okay'
  • 106. def verify_assertion(assertion): page = requests.post( 'https://verifier.login.persona.org/verify', Data={ "assertion": assertion, "audience": 'http://123done.org'}) data = page.json return data.status == 'okay'
  • 107. { status: “okay”, audience: “http://123done.org”, expires: 1344849682560, email: “francois@mozilla.com”, issuer: “login.persona.org” }
  • 108. { status: “failed”, reason: “assertion has expired” }
  • 109.
  • 110.
  • 111.
  • 113. navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; } });
  • 114.
  • 115. 1. load javascript library
  • 116. 1. load javascript library 2. setup login & logout callbacks
  • 117. 1. load javascript library 2. setup login & logout callbacks 3. add login and logout buttons
  • 118. 1. load javascript library 2. setup login & logout callbacks 3. add login and logout buttons 4. verify proof of ownership
  • 119. function do_login() { <?php navigator.id.request(); } if (!empty($_POST)) { function do_logout() { $result = verify_assertion($_POST['assertion']); navigator.id.logout(); if ($result->status === 'okay') { } print_header(); echo "<p>Logged in as: " . $result->email . "</p>"; navigator.id.watch({ echo '<p><a href="javascript:do_logout()">Logout</a></p>'; loggedInUser: $email, print_backLink(); onlogin: function (assertion) { print_footer($result->email); alert("onlogin: $email"); } else { var assertion_field = print_header(); document.getElementById("assertion-field"); echo "<p>Error: " . $result->reason . "</p>"; assertion_field.value = assertion; print_backLink(); var login_form = document.getElementById("login-form"); print_footer(); login_form.submit(); } }, } elseif (!empty($_GET['logout'])) { onlogout: function () { print_header(); alert("onlogout: $email"); echo "<p>You have logged out.</p>"; window.location = '?logout=1'; print_backLink(); } print_footer(); }); } else { </script></body></html> print_header(); EOF; echo "<p><a href="javascript:do_login()">Login</a></p>"; } print_footer(); } function verify_assertion($assertion) { $audience = ($_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://') function print_header() { . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT']; echo <<<EOF $postdata = 'assertion=' . urlencode($assertion) . '&audience=' <!DOCTYPE html><html><head><meta charset="utf-8"></head> . urlencode($audience); <body> <form id="login-form" method="POST"> $ch = curl_init(); <input id="assertion-field" type="hidden" name="assertion" value=""> curl_setopt($ch, CURLOPT_URL, </form> "https://verifier.login.persona.org/verify"); EOF; curl_setopt($ch, CURLOPT_POST, true); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); function print_backLink() { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); echo "<p><a href="persona.php">Back to login page</a></p>"; curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } $json = curl_exec($ch); curl_close($ch); function print_footer($email = 'null') { if ($email !== 'null') { $res = json_decode($json); $email = "'$email'"; $res->status = 'okay'; } $res->email = 'francois@mozilla.com'; echo <<<EOF return $res; <script src="http://127.0.0.1:10002/include.orig.js"></script> } <script> ?>
  • 120. wanna help us solve the password problem?
  • 121. add Persona to your project/site tell us about your experience email one site asking for it
  • 122. add Persona to your project/site tell us about your experience email one site asking for it
  • 123. add Persona to your project/site tell us about your experience email one site asking for it
  • 124.
  • 125. To learn more about Persona: https://login.persona.org/ http://identity.mozilla.com/ https://developer.mozilla.org/docs/Persona/Why_Persona https://developer.mozilla.org/docs/Persona/Quick_Setup https://github.com/mozilla/browserid-cookbook https://developer.mozilla.org/docs/Persona/Libraries_and_plugins http://123done.org/ https://wiki.mozilla.org/Identity#Get_Involved @fmarier http://fmarier.org
  • 127. identity provider API https://eyedee.me/.well-known/browserid: { "public-key": { "algorithm":"RS", "n":"8606...", "e":"65537" }, "authentication": "/browserid/sign_in.html", "provisioning": "/browserid/provision.html" }
  • 128. identity provider API https://eyedee.me/.well-known/browserid: { "public-key": { "algorithm":"RS", "n":"8606...", "e":"65537" }, "authentication": "/browserid/sign_in.html", "provisioning": "/browserid/provision.html" }
  • 129. identity provider API https://eyedee.me/.well-known/browserid: { "public-key": { "algorithm":"RS", "n":"8606...", "e":"65537" }, "authentication": "/browserid/sign_in.html", "provisioning": "/browserid/provision.html" }
  • 130. identity provider API https://eyedee.me/.well-known/browserid: { "public-key": { "algorithm":"RS", "n":"8606...", "e":"65537" }, "authentication": "/browserid/sign_in.html", "provisioning": "/browserid/provision.html" }
  • 131. identity provider API https://eyedee.me/.well-known/browserid: { "public-key": { "algorithm":"RS", "n":"8606...", "e":"65537" }, "authentication": "/browserid/sign_in.html", "provisioning": "/browserid/provision.html" }
  • 132. identity provider API 1. check for your /.well-known/browserid 2. try the provisioning endpoint 3. show the authentication page 4. call the provisioning endpoint again
  • 133. identity provider API 1. check for your /.well-known/browserid 2. try the provisioning endpoint 3. show the authentication page 4. call the provisioning endpoint again
  • 134. identity provider API 1. check for your /.well-known/browserid 2. try the provisioning endpoint 3. show the authentication page 4. call the provisioning endpoint again
  • 135. identity provider API 1. check for your /.well-known/browserid 2. try the provisioning endpoint 3. show the authentication page 4. call the provisioning endpoint again
  • 136. Photo credits: Top 500 passwords: http://xato.net/passwords/more-top-worst-passwords/ Parchment: https://secure.flickr.com/photos/27613359@N03/6750396225/ Elephant in room: https://secure.flickr.com/photos/bitboy/246805948/ Cookie on tray: https://secure.flickr.com/photos/jamisonjudd/4810986199/ Uncle Sam: https://secure.flickr.com/photos/donkeyhotey/5666065982/ Danish passport: https://en.wikipedia.org/wiki/File:DK_Passport_Cover.jpg Restaurant dinner: https://secure.flickr.com/photos/yourdon/3977084094/ © 2013 François Marier <francois@mozilla.com> This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 New Zealand License.