easy logins for php web applications

124
François Marier – @fmarier Easy logins for PHP web applications

Upload: francois-marier

Post on 08-May-2015

810 views

Category:

Technology


1 download

DESCRIPTION

Users hate picking and having to remember them. Developers hate dealing with and storing them. Why are we still using passwords again? Surely there is a better way to log into websites. This talk will introduce the technology behind Persona and the BrowserID protocol. Mozilla intends to solve the password problem on the web with a federated cross-browser system that is intensely focused on user experience and privacy. We may not be able to get rid of all passwords, after all, you probably don't want to be subjected to a fingerprint check before leaving a comment on someone's blog, but we can eliminate site-specific passwords and replace them with something better: a decentralized system that's under the control of users, not a for-profit gatekeeper. It's just four easy steps to add it to your site from scratch and there are already plugins for Drupal, CakePHP, Joomla, SPIP, Symfony2, Wordpress and PHPMyBB.

TRANSCRIPT

Page 1: Easy logins for PHP web applications

François Marier – @fmarier

Easy logins forPHP web applications

Page 2: Easy logins for PHP web applications

passwords

Page 3: Easy logins for PHP web applications

problem #1:

passwords are hard to secure

Page 4: Easy logins for PHP web applications
Page 5: Easy logins for PHP web applications
Page 6: Easy logins for PHP web applications
Page 7: Easy logins for PHP web applications
Page 8: Easy logins for PHP web applications
Page 9: Easy logins for PHP web applications
Page 10: Easy logins for PHP web applications
Page 11: Easy logins for PHP web applications
Page 12: Easy logins for PHP web applications
Page 13: Easy logins for PHP web applications
Page 14: Easy logins for PHP web applications

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 15: Easy logins for PHP web applications

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 16: Easy logins for PHP web applications

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 17: Easy logins for PHP web applications

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 18: Easy logins for PHP web applications

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 19: Easy logins for PHP web applications

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

20132013

passwordpassword

guidelines

guidelines

Page 20: Easy logins for PHP web applications

passwords are hard to secure

they are a liability

Page 21: Easy logins for PHP web applications

ALTER TABLE userDROP COLUMN password;

Page 22: Easy logins for PHP web applications

problem #2:

passwords are hard to remember

Page 23: Easy logins for PHP web applications
Page 24: Easy logins for PHP web applications
Page 25: Easy logins for PHP web applications

pick an easy password

Page 26: Easy logins for PHP web applications

pick an easy password

use it everywhere

Page 27: Easy logins for PHP web applications

passwords are hard to remember

they need to be reset

Page 28: Easy logins for PHP web applications
Page 29: Easy logins for PHP web applications

controlemail

account

controlall

accounts=

Page 30: Easy logins for PHP web applications

what other login solution are you using?

Page 31: Easy logins for PHP web applications
Page 32: Easy logins for PHP web applications

“People want a littledating before marriage.”

Eric Vishria – Rockmelt

Page 33: Easy logins for PHP web applications
Page 34: Easy logins for PHP web applications

decentralised

Page 35: Easy logins for PHP web applications

myid.com/u/francois

Page 36: Easy logins for PHP web applications
Page 37: Easy logins for PHP web applications
Page 38: Easy logins for PHP web applications

privacy®

Page 39: Easy logins for PHP web applications

existing login systemsare not good enough

Page 40: Easy logins for PHP web applications

ideal web-wide identity system

Page 41: Easy logins for PHP web applications

● decentralised● simple● cross-browser

ideal web-wide identity system

Page 42: Easy logins for PHP web applications

● decentralised● simple● cross-browser

ideal web-wide identity system

Page 43: Easy logins for PHP web applications

● decentralised● simple

cross-browser

ideal web-wide identity system

Page 44: Easy logins for PHP web applications

what if it were a standardpart of the web browser?

Page 45: Easy logins for PHP web applications
Page 46: Easy logins for PHP web applications

how does it work?

Page 48: Easy logins for PHP web applications

why email addresses?

Page 49: Easy logins for PHP web applications

why email addresses?

already federated

people know their email

natural association between person & email

easy to have separate identities

most sites need a way to contact users

no lock-in

Page 50: Easy logins for PHP web applications

why email addresses?

already federated

people know their email

natural association between person & email

easy to have separate identities

most sites need a way to contact users

no lock-in

Page 51: Easy logins for PHP web applications

why email addresses?

already federated

people know their email

natural association between person & email

easy to have separate identities

most sites need a way to contact users

no lock-in

Page 52: Easy logins for PHP web applications

why email addresses?

already federated

people know their email

natural association between person & email

easy to have separate identities

most sites need a way to contact users

no lock-in

Page 53: Easy logins for PHP web applications

why email addresses?

already federated

people know their email

natural association between person & email

easy to have separate identities

most sites need a way to contact users

no lock-in

Page 54: Easy logins for PHP web applications

why email addresses?

already federated

people know their email

natural association between person & email

easy to have separate identities

most sites need a way to contact users

no lock-in

Page 56: Easy logins for PHP web applications

demo #1:

http://www.voo.st/

[email protected]

Page 57: Easy logins for PHP web applications

Persona is already adecentralised system

Page 58: Easy logins for PHP web applications

decentralisation is the answer, but it's not

a product adoption strategy

Page 59: Easy logins for PHP web applications

we can't wait for all domainsto adopt Persona

Page 60: Easy logins for PHP web applications

we can't wait for all domainsto adopt Persona

solution: a temporarycentralised fallback

Page 61: Easy logins for PHP web applications

demo #2:

http://sloblog.io/

[email protected]

Page 62: Easy logins for PHP web applications

Persona already workswith all email domains

Page 63: Easy logins for PHP web applications

identity bridging

Page 64: Easy logins for PHP web applications

demo #3:

http://www.reasonwell.com/

[email protected]

Page 65: Easy logins for PHP web applications
Page 66: Easy logins for PHP web applications
Page 67: Easy logins for PHP web applications
Page 68: Easy logins for PHP web applications

Persona supportsall modern browsers

>= 8

Page 69: Easy logins for PHP web applications

Persona is decentralised,simple and cross-browser

Page 70: Easy logins for PHP web applications

it's simple for users, but is it also

simple for developers?

Page 71: Easy logins for PHP web applications
Page 72: Easy logins for PHP web applications

<script src=”https://login.persona.org/include.js”></script></body></html>

Page 73: Easy logins for PHP web applications

navigator.id.watch({ loggedInEmail: “[email protected]”, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 74: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: “[email protected]”, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 75: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 76: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 77: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 78: Easy logins for PHP web applications
Page 79: Easy logins for PHP web applications

navigator.id.request()

Page 80: Easy logins for PHP web applications
Page 81: Easy logins for PHP web applications
Page 82: Easy logins for PHP web applications
Page 83: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 84: Easy logins for PHP web applications

eyJhbGciOiJEUzEyOCJ9.eyJwdWJsaWMta2V5Ijp7ImFsZ29yaXRobSI6IkRTIiwieSI6ImNhZDg2ZDgyNWU0MjBkMGI4Njk5MjM4ZDM5ZTFjYjIyOGMyMTk1NWFiMzcwOTQ1YzExNzBhMzM4NjcyNDM0ZDJmNGYxZDg5ZjFkZjMzNmU1ZjZjZjk2YjhiOTlmMjgyNmFjNTYxZmI1YWMyYTc4ZjNhMzBkNGYxNTVhYjc3ZGExYmY3MWU4ZGMzNjQ0MmU2NjQ3MmE5Mjg0N2I2YjFlNDRkMTJlM2IwMjVjOWZmNTFmNDdhMWE5ZWYyMGZhOTVjMTcxZjBkMTYzNGE4ZTY4YTk5NWU3ZjFjY2FiYTJlOTRjYTI3ODE1ZWVkMTcxYjY1YTJmZGQzNTE1NjY3OTI0ZjUiLCJwIjoiZmY2MDA0ODNkYjZhYmZjNWI0NWVhYjc4NTk0YjM1MzNkNTUwZDlmMWJmMmE5OTJhN2E4ZGFhNmRjMzRmODA0NWFkNGU2ZTBjNDI5ZDMzNGVlZWFhZWZkN2UyM2Q0ODEwYmUwMGU0Y2MxNDkyY2JhMzI1YmE4MWZmMmQ1YTViMzA1YThkMTdlYjNiZjRhMDZhMzQ5ZDM5MmUwMGQzMjk3NDRhNTE3OTM4MDM0NGU4MmExOGM0NzkzMzQzOGY4OTFlMjJhZWVmODEyZDY5YzhmNzVlMzI2Y2I3MGVhMDAwYzNmNzc2ZGZkYmQ2MDQ2MzhjMmVmNzE3ZmMyNmQwMmUxNyIsInEiOiJlMjFlMDRmOTExZDFlZDc5OTEwMDhlY2FhYjNiZjc3NTk4NDMwOWMzIiwiZyI6ImM1MmE0YTBmZjNiN2U2MWZkZjE4NjdjZTg0MTM4MzY5YTYxNTRmNGFmYTkyOTY2ZTNjODI3ZTI1Y2ZhNmNmNTA4YjkwZTVkZTQxOWUxMzM3ZTA3YTJlOWUyYTNjZDVkZWE3MDRkMTc1ZjhlYmY2YWYzOTdkNjllMTEwYjk2YWZiMTdjN2EwMzI1OTMyOWU0ODI5YjBkMDNiYmM3ODk2YjE1YjRhZGU1M2UxMzA4NThjYzM0ZDk2MjY5YWE4OTA0MWY0MDkxMzZjNzI0MmEzODg5NWM5ZDViY2NhZDRmMzg5YWYxZDdhNGJkMTM5OGJkMDcyZGZmYTg5NjIzMzM5N2EifSwicHJpbmNpcGFsIjp7ImVtYWlsIjoiZm9vQG1vY2tteWlkLmNvbSJ9LCJpYXQiOjEzNzY1MzY0NjM1MTgsImV4cCI6MTM3NjU0MDA2MzUxOCwiaXNzIjoibW9ja215aWQuY29tIn0.IeUR0_3ayAZkdNSXjF4aaCwSHnHa4X1lzrjX-qkNcPIbXx1hmQQPwg~eyJhbGciOiJEUzEyOCJ9.eyJleHAiOjEzNzY1MzY3MDc2MzUsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3QifQ.NJ8H1qZcWXbXfPJSdgB_mORHQ442ZkY0XYfdQsZZsIjooG7k7qWyVw

Page 85: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 86: Easy logins for PHP web applications

require_once('Auth/BrowserID.php');

$verifier = new Auth_BrowserID('http://123done.org');$result = $verifier->verifyAssertion($_POST['assertion']);

Page 87: Easy logins for PHP web applications

object(stdClass)#2 (5) { ["status"]=> string(4) "okay" ["audience"]=> string(19) "http://123done.org" ["expires"]=> int(1376282614825) ["issuer"]=> string(17) "login.mozilla.org" ["email"]=> string(20) "[email protected]"}

Page 88: Easy logins for PHP web applications

require_once('Auth/BrowserID.php');

$verifier = new Auth_BrowserID('http://123done.org');$result = $verifier->verifyAssertion($_POST['assertion']);

if ($result->status === 'okay') { echo "Hi " . $result->email;} else { echo "Error: " . $result->reason;}

Page 89: Easy logins for PHP web applications

object(stdClass)#2 (2) { ["status"]=> string(6) "failed" ["reason"]=> string(21) "assertion has expired"}

Page 90: Easy logins for PHP web applications

require_once('Auth/BrowserID.php');

$verifier = new Auth_BrowserID('http://123done.org');$result = $verifier->verifyAssertion($_POST['assertion']);

if ($result->status === 'okay') { echo "Hi " . $result->email;} else { echo "Error: " . $result->reason;}

Page 91: Easy logins for PHP web applications
Page 92: Easy logins for PHP web applications
Page 93: Easy logins for PHP web applications

navigator.id.logout()

Page 94: Easy logins for PHP web applications

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 95: Easy logins for PHP web applications
Page 96: Easy logins for PHP web applications

1. load javascript library

Page 97: Easy logins for PHP web applications

1. load javascript library

2. setup login & logout callbacks

Page 98: Easy logins for PHP web applications

1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

Page 99: Easy logins for PHP web applications

1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

4. verify proof of ownership

Page 100: Easy logins for PHP web applications

1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

4. verify proof of ownership

no API keyneeded

Page 101: Easy logins for PHP web applications

you can add support forPersona in four easy steps

Page 102: Easy logins for PHP web applications
Page 103: Easy logins for PHP web applications

one simple request

Page 104: Easy logins for PHP web applications
Page 105: Easy logins for PHP web applications

building a new site:default to Persona

Page 106: Easy logins for PHP web applications
Page 107: Easy logins for PHP web applications
Page 108: Easy logins for PHP web applications

working on an existing site/app:add support for Persona

Page 109: Easy logins for PHP web applications

before

Page 110: Easy logins for PHP web applications

after

Page 111: Easy logins for PHP web applications

after

navigator.id.request()

Page 112: Easy logins for PHP web applications
Page 113: Easy logins for PHP web applications

ALTER TABLE userDROP COLUMN password;

Page 114: Easy logins for PHP web applications

To learn more about Persona:

https://login.persona.org/http://identity.mozilla.com/

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

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

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

@fmarier http://fmarier.org

Page 115: Easy logins for PHP web applications

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"}

Page 116: Easy logins for PHP web applications

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

Page 117: Easy logins for PHP web applications

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

Page 118: Easy logins for PHP web applications

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

Page 119: Easy logins for PHP web applications

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

Page 120: Easy logins for PHP web applications

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

Page 121: Easy logins for PHP web applications

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

Page 122: Easy logins for PHP web applications

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

Page 123: Easy logins for PHP web applications

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

Page 124: Easy logins for PHP web applications

© 2013 François Marier <[email protected]>This work is licensed under aCreative Commons Attribution-ShareAlike 3.0 New Zealand License.

Hotel doorman: https://secure.flickr.com/photos/wildlife_encounters/8024166802/

Top 500 passwords: http://xato.net/passwords/more-top-worst-passwords/

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

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

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

Stop sign: https://secure.flickr.com/photos/artbystevejohnson/6673406227/

Photo credits: