SlideShare ist ein Scribd-Unternehmen logo
1 von 136
Downloaden Sie, um offline zu lesen
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.

Weitere ähnliche Inhalte

Was ist angesagt?

DOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryDOM Scripting Toolkit - jQuery
DOM Scripting Toolkit - jQueryRemy Sharp
 
Symfony CoP: Form component
Symfony CoP: Form componentSymfony CoP: Form component
Symfony CoP: Form componentSamuel ROZE
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2eugenio pombi
 
HirshHorn theme: how I created it
HirshHorn theme: how I created itHirshHorn theme: how I created it
HirshHorn theme: how I created itPaul 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 patternsSamuel ROZE
 
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 PimpleHugo Hamon
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuerysergioafp
 
Command-Oriented Architecture
Command-Oriented ArchitectureCommand-Oriented Architecture
Command-Oriented ArchitectureLuiz Messias
 
Functionality Focused Code Organization
Functionality Focused Code OrganizationFunctionality Focused Code Organization
Functionality Focused Code OrganizationRebecca Murphey
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHPGuilherme Blanco
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 

Was ist angesagt? (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
 

Ähnlich wie 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 answerFrancois 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 passwordsFrancois Marier
 
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 AppsBastian Hofmann
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ EtsyNishan 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 2015Fernando Daciuk
 
Authenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsAuthenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsJimmy Guerrero
 
17. CodeIgniter login simplu cu sesiuni
17. CodeIgniter login simplu cu sesiuni17. CodeIgniter login simplu cu sesiuni
17. CodeIgniter login simplu cu sesiuniRazvan 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 mockingKonstantin Kudryashov
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityRyan Weaver
 
Form demoinplaywithmysql
Form demoinplaywithmysqlForm demoinplaywithmysql
Form demoinplaywithmysqlKnoldus Inc.
 
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 moreRyan 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 KyivGrossum Software Outsourcing
 
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 KyivGrossum
 

Ähnlich wie 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
 

Mehr von 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 UsersFrancois 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 WebappFrancois Marier
 
Hardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyHardening Firefox for Security and Privacy
Hardening Firefox for Security and PrivacyFrancois 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 2016Francois Marier
 
Privacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxPrivacy and Tracking Protection in Firefox
Privacy and Tracking Protection in FirefoxFrancois 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 2015Francois Marier
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptFrancois Marier
 
Integrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptIntegrity protection for third-party JavaScript
Integrity protection for third-party JavaScriptFrancois 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 familyFrancois Marier
 
Outsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianOutsourcing your webapp maintenance to Debian
Outsourcing your webapp maintenance to DebianFrancois Marier
 
Easy logins for Ruby web applications
Easy logins for Ruby web applicationsEasy logins for Ruby web applications
Easy logins for Ruby web applicationsFrancois Marier
 
Easy logins for JavaScript web applications
Easy logins for JavaScript web applicationsEasy logins for JavaScript web applications
Easy logins for JavaScript web applicationsFrancois 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 JavaScriptFrancois 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 passwordsFrancois Marier
 
Easy logins for PHP web applications
Easy logins for PHP web applicationsEasy logins for PHP web applications
Easy logins for PHP web applicationsFrancois 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 WebFrancois 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 inFrancois Marier
 

Mehr von 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
 

Kürzlich hochgeladen

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 

Kürzlich hochgeladen (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 

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.