From 0146b94863f7bb2e3b1d163e5c965a3d25a34b2a Mon Sep 17 00:00:00 2001
From: Olav Morken <olav.morken@uninett.no>
Date: Tue, 6 Oct 2009 09:35:40 +0000
Subject: [PATCH] docs: Document SP migration from old to new code.

Update issue 207
Status: Started
Owner: andreassolberg
The document should be added to the documents at rnd.feide.no.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@1823 44740490-163a-0410-bde0-09ae8108e29a
---
 docs/simplesamlphp-sp-migration.txt | 261 ++++++++++++++++++++++++++++
 1 file changed, 261 insertions(+)
 create mode 100644 docs/simplesamlphp-sp-migration.txt

diff --git a/docs/simplesamlphp-sp-migration.txt b/docs/simplesamlphp-sp-migration.txt
new file mode 100644
index 000000000..a0136de18
--- /dev/null
+++ b/docs/simplesamlphp-sp-migration.txt
@@ -0,0 +1,261 @@
+Migrating to the `saml` module
+==============================
+
+This document describes how you can migrate your code to use the `saml` module for authentication against SAML 2.0 and SAML 1.1 IdPs.
+It assumes that you have previously set up a SP by using redirects to `saml2/sp/initSSO.php`.
+
+The steps we are going to follow are:
+
+1. Create a new authentication source.
+2. Add the metadata for this authentication source to the IdP.
+3. Test the new authentication source.
+4. Convert the application to use the new API.
+5. Test the application.
+6. Remove the old metadata from the IdP.
+7. Disable the old SAML 2 SP.
+
+
+Create a new authentication source
+----------------------------------
+
+In this step we are going to create an authentication source which uses the `saml` module for authentication.
+To do this, we open `config/authsources.php`. Create the file if it does not exist.
+If you create the file, it should looke like this:
+
+    <?php
+    $config = array(
+        /* Here we can add entries for authentication sources we want to use. */
+    );
+
+
+We are going to add an entry to this file.
+The entry should look something like this:
+
+    'default-sp' => array(
+        'saml:SP',
+
+        /*
+         * The entity ID of this SP.
+         * Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
+         */
+        'entityID' => NULL,
+
+        /*
+         * The entity ID of the IdP this should SP should contact.
+         * Can be NULL/unset, in which case the user will be shown a list of available IdPs.
+         */
+        'idp' => NULL,
+
+        /* Here you can add other options to the SP. */
+    ),
+
+`default-sp` is the name of the authentication source.
+It is used to refer to this authentication source when we use it.
+`saml:SP` tells simpleSAMLphp that authentication with this authentication source is handled by the `saml` module.
+
+The `idp` option should be set to the same value that is set in `default-saml20-idp` in `config.php`.
+
+To ease migration, you probably want the entity ID on the new SP to be different than on the old SP.
+This makes it possible to have both the old and the new SP active on the IdP at the same time.
+
+You can also add other options this authentication source.
+See the [`saml:SP`](https://rnd.feide.no/content/saml-service-provider-configuration-reference) documentation for more information.
+
+
+Add the metadata for this authentication source to the IdP
+----------------------------------------------------------
+
+After adding the authentication source on the SP, you need to register the metadata on the IdP.
+To retrieve the metadata, open the frontpage of your simpleSAMLphp installation, and go to the federation tab.
+You should have a list of metadata entries, and one will be marked with the name of the new authentication source.
+In our case, that was `default-sp`.
+
+Click the `Show metadata` link, and you will arrive on a web page with the metadata for that service provider.
+How you proceed from here depends on which IdP you are connecting to.
+
+If you use a simpleSAMLphp IdP, you can use the metadata in the flat file format at the bottom of the page.
+That metadata should be added to `saml20-sp-remote.php` on the IdP.
+For other IdPs you probably want to use the XML metadata.
+
+
+Test the new authentication source
+----------------------------------
+
+You should now be able to log in using the new authentication source.
+Go to the frontpage of your simpleSAMLphp installation and open the authentication tab.
+There you will find a link to test authentication sources.
+Click that link, and select the name of your authentication source (`default-sp` in our case).
+
+You should be able to log in using that authentication source, and receive the attributes from the IdP.
+
+
+Convert the application to use the new API
+------------------------------------------
+
+This section will go through some common changes that you need to do when you are using simpleSAMLphp from a different application.
+
+### `_include.php`
+
+You should also no longer include `.../simplesamlphp/www/_include.php`.
+Instead, you should include `.../simplesamlphp/lib/_autoload.php`.
+
+This means that you replace lines like:
+
+    require_once('.../simplesamlphp/www/_include.php');
+
+with:
+
+    require_once('.../simplesamlphp/lib/_autoload.php');
+
+`_autoload.php` will register an autoloader function for the simpleSAMLphp classes.
+This makes it possible to access the classes from your application.
+`_include.php` does the same, but also has some side-effects that you may not want in your application.
+
+If you load any simpleSAMLphp class files directly, you should remove those lines.
+That means that you should remove lines like the following:
+
+    require_once('SimpleSAML/Utilities.php');
+    require_once('SimpleSAML/Session.php');
+    require_once('SimpleSAML/XHTML/Template.php');
+
+
+### Authentication API
+
+There is a new authentication API in simpleSAMLphp which can be used to authenticate against authentication sources.
+This API is designed to handle the common operations.
+
+
+#### Overview
+
+This is a quick overview of the API:
+
+    /* Get a reference to our authentication source. */
+    $as = new SimpleSAML_Auth_Simple('default-sp');
+
+    /* Require the user to be authentcated. */
+    $as->requireAuth();
+    /* When that function returns, we have an authenticated user. */
+
+    /*
+     * Retrieve attributes of the user.
+     *
+     * Note: If the user isn't authenticated when getAttributes() is
+     * called, an empty array will be returned.
+     */
+    $attributes = $as->getAttributes();
+
+    /* Log the user out. */
+    $as->logout();
+
+
+#### `$config` and `$session`
+
+Generally, if you have:
+
+    $config = SimpleSAML_Configuration::getInstance();
+    $session = SimpleSAML_Session::getInstance();
+
+you should replace it with this single line:
+
+    $as = new SimpleSAML_Auth_Simple('default-sp');
+
+
+#### Requiring authentication
+
+Blocks of code like the following:
+
+    /* Check if valid local session exists.. */
+    if (!isset($session) || !$session->isValid('saml2') ) {
+      SimpleSAML_Utilities::redirect(
+        '/' . $config->getBaseURL() .
+        'saml2/sp/initSSO.php',
+        array('RelayState' => SimpleSAML_Utilities::selfURL())
+        );
+    }
+
+should be replaced with a single call to `requireAuth()`:
+
+    $as->requireAuth();
+
+
+#### Fetching attributes
+
+Where you previously called:
+
+    $session->getAttributes();
+
+you should now call:
+
+    $as->getAttributes();
+
+
+#### Logging out
+
+Redirecting to the initSLO-script:
+
+    SimpleSAML_Utilities::redirect(
+        '/' . $config->getBaseURL() .
+        'saml2/sp/initSLO.php',
+        array('RelayState' => SimpleSAML_Utilities::selfURL())
+        );
+
+should be replaced with a call to `logout()`:
+
+    $as->logout();
+
+If you want to return to a specific URL after logging out, you should include that URL as a parameter to the logout function:
+
+    $as->logout('https://example.org/');
+
+
+Test the application
+--------------------
+
+How you test the application is highly dependent on the application, but here are the elements you should test:
+
+
+### SP initiated login
+
+Make sure that it is still possible to log into the application.
+
+
+### IdP initiated login
+
+If you use a simpleSAMLphp IdP, and you want users to be able to bookmark the login page, you need to test IdP initiated login.
+To test IdP initiated login from a simpleSAMLphp IdP, you can access:
+
+    https://.../simplesaml/saml2/idp/SSOService.php?spentityid=<entity ID of your SP>&RelayState=<URL the user should be sent to after login>
+
+Note that the RelayState parameter is only supported if the IdP runs version 1.5 of simpleSAMLphp.
+If it isn't supported by the IdP, you need to configure the `RelayState` option in the authentication source configuration.
+
+
+### SP initiated logout
+
+Make sure that logging out of your application also logs out of the IdP.
+If this does not work, users who log out of your application can log in again without entering any username or password.
+
+
+### IdP initiated logout
+
+This is used by the IdP if the user logs out of a different SP connected to the IdP.
+In this case, the user should also be logged out of your application.
+
+The easiest way to test this is if you have two SPs connected to the IdP.
+You can then log out of one SP and check that you are also logged out of the other.
+
+
+Remove the old metadata from the IdP
+------------------------------------
+
+Once the new SP works correctly, you can remove the metadata for the old SP from the IdP.
+How you do that depends on the IdP.
+If you are running a simpleSAMLphp IdP, you can remove the entry for the old SP in `metadata/saml20-sp-remote.php`.
+
+
+Disable the old SAML 2 SP
+-------------------------
+
+You may also want to disable the old SP code in simpleSAMLphp.
+To do that, open `config/config.php`, and change the `enable.saml20-sp` option to `FALSE`.
+
-- 
GitLab