https://github.com/0k/multidomain-sso
Quick example of a PHP multi-domain browser single-sign-on
https://github.com/0k/multidomain-sso
Last synced: 12 months ago
JSON representation
Quick example of a PHP multi-domain browser single-sign-on
- Host: GitHub
- URL: https://github.com/0k/multidomain-sso
- Owner: 0k
- Created: 2012-08-10T16:57:32.000Z (almost 14 years ago)
- Default Branch: master
- Last Pushed: 2016-10-03T10:21:30.000Z (over 9 years ago)
- Last Synced: 2024-03-26T14:24:39.947Z (about 2 years ago)
- Language: PHP
- Size: 11.7 KB
- Stars: 56
- Watchers: 10
- Forks: 28
- Open Issues: 1
-
Metadata Files:
- Readme: README.rst
Awesome Lists containing this project
README
===============
multidomain-sso
===============
Proof of concept for multi-domain single-sign on for PHP applications.
General Presentation
====================
What is it ?
------------
Say you have HTTP domains ``foo.com`` and ``bar.org`` part of the same
authentication domain. Which means that authentication from
http://foo.com and http://bar.org uses the same database for
authentication, and users are able to log in both domain with their
password.
And you want to manage a single-sign on, which would mean for instance:
1 - open http://foo.com, sign in.
2 - go to http://bar.org, hurray ! you are recognized and you are
already signed in with no action from you.
This is not about centralization of authentication. Authentication
mecanism is a separate concern.
This is about circonventing the fact that when connecting to a domain for
the first time, the browser and the server have no clues allowing you to be
recognized. So how could we manage to log in other non-visited website ?
Demo
----
Want to test-it ? check:
- http://foo.demo.0k.io/multidomain-sso/php
- http://bar.demo.0k.io/multidomain-sso/php
These domain are linked. If it doesn't seem to work with you, please send
me a issue request !
How does it works ?
-------------------
The trick is quite simple and not new: when logging in ``foo.com`` a
silent AJAX call will make your browser visit ``bar.org`` setting up
session information between the browser and the server and effectively
log you in ``bar.org``. Thus, your future "first" visit to
``bar.org`` won't be the real first time the browser and the server
communicates.
How do you circumvents all javascript cross domain restrictions ?
-----------------------------------------------------------------
By using HTTP headers accordingly to CORS_.
.. _CORS: https://developer.mozilla.org/en-US/docs/HTTP_access_control
Do you store the login password and send it to other domains ?
--------------------------------------------------------------
No, you shouldn't store password anywhere. What is sent are tokens
identifying an already opened connection. These tokens are
often called "session ids" and have the appearance of a random hex
fingerprint string generated at login time.
Can I re-use some parts ?
-------------------------
If you find anything useful please feel free to borrow ideas and
code. Any comments, examples or code is welcome also.
Usage
=====
Overview
--------
``auth.php`` provides the abstract class that needs to be implemented
with various subclasses. It needs:
- an ``AuthProvider``, which is used as the authentication backend
- an ``AuthTokenStore``, which is used to store locally authentication tokens
- an ``AuthWebTransmitter``, which is responsible of sending auth tokens
``oeauth.php`` shows how to build a custom class. This one uses OpenERP
as authentication backend, and classical PHP ``$_SESSION`` magic
variable for session token storage. And a re-usable Javascript pattern is used
as a way to propagate tokens to other domains.
You could for example, replace the ``AuthProvider`` class to change
the authentication backend, without changing much in both two other
(you might need to change code related to the session tokens that your
new ``AuthProvider`` will produce and require).
Requirements
------------
This packages requires php-oe-json_ which itself will require
Tivoka_ which was patched for session id support on version ``>= 3.2.*`` .
.. _php-oe-json: https://github.com/0k/php-oe-json
.. _Tivoka: https://github.com/marcelklehr/tivoka