Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Taking the pain out of signing users in
Search
Francois Marier
July 25, 2013
Programming
330
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Taking the pain out of signing users in
Francois Marier
July 25, 2013
More Decks by Francois Marier
See All by Francois Marier
Security and Privacy settings for Firefox Power Users
fmarier
0
390
Getting Browsers to Improve the Security of Your Webapp
fmarier
0
350
Hardening Firefox for Privacy and Security
fmarier
0
1.2k
Security and Privacy on the Web in 2016
fmarier
0
250
Privacy and Tracking Protection in Firefox
fmarier
0
340
Security and Privacy on the Web in 2015
fmarier
0
440
Security and Privacy on the Web in 2015
fmarier
0
220
Integrity protection for third-party JavaScript
fmarier
1
880
URL to HTML
fmarier
1
340
Other Decks in Programming
See All in Programming
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
230
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
470
React本体のコードリーディング
high_g_engineer
1
140
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
190
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
650
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
360
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
290
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
180
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.6k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
920
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
380
Raft: Consensus for Rubyists
vanstee
141
7.6k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Agile that works and the tools we love
rasmusluckow
331
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
240
Mind Mapping
helmedeiros
PRO
1
310
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1.1k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Transcript
François Marier – @fmarier Taking the pain out of signing
users in
passwords
problem #1: passwords are hard to secure
None
None
None
None
None
None
None
None
None
bcrypt / scrypt / pbkdf2 per-user salt site secret password
& lockout policies secure recovery
bcrypt / scrypt / pbkdf2 per-user salt site secret password
& lockout policies secure recovery
bcrypt / scrypt / pbkdf2 per-user salt site secret password
& lockout policies secure recovery
bcrypt / scrypt / pbkdf2 per-user salt site secret password
& lockout policies secure recovery
bcrypt / scrypt / pbkdf2 per-user salt site secret password
& lockout policies secure recovery
bcrypt / scrypt / pbkdf2 per-user salt site secret password
& lockout policies secure recovery 2013 2013 password password guidelines guidelines
passwords are hard to secure they are a liability
ALTER TABLE user DROP COLUMN password;
problem #2: passwords are hard to remember
None
None
pick an easy password
use it everywhere
passwords are hard to remember they need to be reset
None
control email account control all accounts =
None
“People want a little dating before marriage.” Eric Vishria –
Rockmelt
None
decentralised
myid.com/u/francois
None
None
existing login systems are not good enough
ideal web-wide identity system
• decentralised simple cross-browser ideal web-wide identity system
• decentralised • simple cross-browser ideal web-wide identity system
• decentralised • simple • cross-browser ideal web-wide identity system
what if it were a standard part of the web
browser?
None
how does it work?
[email protected]
demo #1: http://www.voo.st/
[email protected]
Persona is already a decentralised system
decentralisation is the answer, but it's not a product adoption
strategy
we can't wait for all domains to adopt Persona
we can't wait for all domains to adopt Persona solution:
a temporary centralised fallback
demo #2: http://sloblog.io/
[email protected]
Persona already works with all email domains
identity bridging
demo #3: http://www.reasonwell.com/
[email protected]
None
None
None
None
>= 8
Persona is decentralized, simple and cross-browser
it's simple for users, but is it also simple for
developers?
None
<script src=”https://login.persona.org/include.js”> </script> </body></html>
navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion},
function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; } });
navigator.id.watch({ loggedInUser: "
[email protected]
" onlogin: function (assertion) { $.post('/login', {assertion: assertion},
function (data) { window.location = '/home'; } ); }, 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'; } });
navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion},
function (data) { window.location = '/home'; } ); } 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'; } });
None
navigator.id.request()
None
None
None
navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion},
function (data) { window.location = '/home'; } ); }, 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'
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: “
[email protected]
”, issuer:
“login.persona.org” }
{ status: “failed”, reason: “assertion has expired” }
None
None
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'; } });
None
1. load javascript library 2. setup login & logout callbacks
3. add login and logout buttons 4. verify proof of ownership
1. load javascript library 2. setup login & logout callbacks
3. add login and logout buttons 4. verify proof of ownership
1. load javascript library 2. setup login & logout callbacks
3. add login and logout buttons 4. verify proof of ownership
1. load javascript library 2. setup login & logout callbacks
3. add login and logout buttons 4. verify proof of ownership
you can add support for Persona in four easy steps
one simple request
None
building a new site: default to Persona
working on an existing site/app: add support for Persona
To learn more about Persona: https://login.persona.org/ http://identity.mozilla.com/ 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
© 2013 François Marier <
[email protected]
> This work is licensed under
a Creative 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: