Configuration de la connexion unique à l'aide de MobileFirst® 7.0

You can set up single sign-on with MobileFirst® so users can share a session between a HCL and MobileFirst® server.

Avant de commencer

Les serveurs HCL et MobileFirst® doivent être configurés pour utiliser le même registre d'utilisateurs, les mêmes clés LTPA, et doivent être configurés avec indication d'un domaine pour SSO. Si vous utilisez le serveur WebSphere® Application Server, reportez-vous à la documentation de WebSphere® Application Server.

Pour plus d'informations sur la configuration système requise, voir Configuration requise.

Procédure

  1. Exécutez les tâches configEngine suivantes. Ces tâches configEngine sont disponibles sur le serveur HCL. Si le serveur MobileFirst® se trouve sur WebSphere® Application Server, exécutez les commandes suivantes à partir de la console WebSphere® Integrated Solutions Console. Vous pouvez utiliser les étapes B et C si MobileFirst® se trouve dans la même instance qu'HCL .
    1. ConfigEngine.bat configure-single-signon -Ddomain=domain name -DWasRemoteHostName=hostname -DWasSoapPort=port -DWasPassword=password -Dinteroperable=true -DattributePropagation=true -DrequiresSSL=false
    2. Facultatif : ConfigEngine.bat export-ltpakeys-single-signon -DkeyFile=c:\ltpa.txt -DkeyPass=<testpass> -DdmgrFlag=false -DWasRemoteHostName=hostname -DWasSoapPort=port -DWasPassword=password
    3. Facultatif : ConfigEngine.bat import-ltpakeys-single-signon -DkeyFile=c:\ltpa_demo.txt -DkeyPass=<somepassword> -DdmgrFlag=false -DWasRemoteHostName=hostname -DWasSoapPort=port -DWasPassword=password
  2. Pour préparer le serveur MobileFirst®, vous devez mettre à jour le fichier WAR MobileFirst® pour permettre aux applications de s'authentifier auprès du registre des utilisateurs. Mettez à jour authenticationConfig.xml au sein de votre projet MobileFirst®. IT est dans MobileFirst Project/server/conf/authenticationConfig.xml. Localisez l'élément <securityTests> et ajoutez les tests de sécurité mobile et Web.
    1. Localisez l'élément <securityTests> et ajoutez les tests de sécurité mobile et Web à partir de l'exemple suivant.
      <mobileSecurityTest name="mobileTests"> 
          <testDeviceId provisioningType="none" /> 
          <testUser realm="WASLTPARealm" /> 
      </mobileSecurityTest> 
      <webSecurityTest name="WASLTPARealmTests"> 
          <testUser realm="WASLTPARealm"/> 
      </webSecurityTest> 
    2. Supprimez la mise en commentaire du domaine de sécurité.
      <!-- For websphere --> 
      <realm name="WASLTPARealm" loginModule="WASLTPAModule">
         <className>com.worklight.core.auth.ext.WebSphereFormBasedAuthenticator
             </className> 
         <parameter name="login-page" value="/login.html"/> 
         <parameter name="error-page" value="/loginError.html"/> 
      </realm>
    3. Supprimez la mise en commentaire du module de connexion pour WebSphere.
      <!-- For websphere --> 
      <loginModule name="WASLTPAModule"> 
          <className>com.worklight.core.auth.ext.WebSphereLoginModule</className> 
      </loginModule>
  3. Modifiez le fichier WAR du projet MobileFirst® en ajoutant deux nouveaux fichiers HTML au fichier WAR. Le fichier WAR de projet se trouve dans le répertoire /MobileFirst Project/bin. Copiez ce fichier WAR à un autre emplacement pour l'éditer.
    1. Créez un fichier login.html avec le contenu suivant :
      <html> 
          <head> 
              <title>Login</title> 
          </head> 
          <body> 
              <form method="post" action="j_security_check"> 
                  <label for="j_username">User name:</label> 
                  <input type="text" id="j_username" name="j_username" /> 
                  <br /> 
                  <label for="j_password">Password:</label> 
                  <input type="password" id="j_password" name="j_password" /> 
                  <br /> 
                  <input type="submit" id="login" name="login" value="Log In" /> 
              </form> 
          </body> 
      </html>
    2. Create a loginError.html file with the following contents:
      <html> 
          <head></head> 
          <body> 
              Login Error 
          </body> 
      </html>
    3. Ajoutez les fichiers login.html et loginError.html au répertoire de plus haut niveau du fichier WAR.
  4. Modifiez le fichier WAR de projet MobileFirst® qui a été mis à jour dans l'étape précédente en éditant le fichier web.xml dans le répertoire WEB-INF.
    <login-config> 
        <auth-method>FORM</auth-method> 
        <form-login-config> 
            <form-login-page>/login.html</form-login-page> 
            <form-error-page>/loginError.html</form-error-page> 
        </form-login-config> 
    </login-config>
  5. Facultatif : Ajoutez une contrainte de sécurité pour protéger la ressource Web en modifiant le fichier web.xml dans le fichier WAR de projet MobileFirst® :
    <security-constraint id="SecurityConstraint_1">
    	<web-resource-collection id="WebResourceCollection_1">
    		<web-resource-name>mobilefirst</web-resource-name>
    		<description>Protecting mobilefirst application</description>
    		<url-pattern>/*</url-pattern>
    		<http-method>GET</http-method>
    		<http-method>POST</http-method>
    	</web-resource-collection>
    	<auth-constraint id="AuthConstraint_1">
    		<description>MobileFirst applications</description>
    		<role-name>Administrator</role-name>
    	</auth-constraint>
    	<user-data-constraint id="UserDataConstraint_1">
    		<transport-guarantee>NONE</transport-guarantee>
    	</user-data-constraint>
    </security-constraint>
    
    <security-role id="SecurityRole_1">
    	<description>Only specific users</description>
    	<role-name>Administrator</role-name>
    </security-role>
  6. Lorsque le fichier WAR de projet MobileFirst® est mis à jour, déployez-le sur le serveur MobileFirst®.
  7. Redémarrez le serveur sur lequel MobileFirst® est installé. Si vous avez ajouté la contrainte de sécurité, mappez le groupe ou l'utilisateur sur le fichier EAR.
  8. Mettez à jour le fichier application-descriptor.xml afin d'ajouter les tests de sécurité que vous avez configurés. Ouvrez le fichier MobileFirst Project/apps/mobilefirst app/application-descriptor.xml dans la vue de conception et mettez-le à jour afin de disposer des domaines et des tâches de sécurité corrects.
  9. Dans l'application principale, ajoutez un test de sécurité appelé WASLTPARealmTests dans la section Common (optional).
  10. Dans Téléphones et tablettes Android > Détails, ajoutez le test de sécurité appelé mobileTests.
  11. Après avoir créé le fichier WAR côté serveur, modifiez le côté client pour permettre l'authentification entre les deux serveurs. Dans une application de démonstration, modifiez le code HTML de MobileFirst Project/apps/mobilefirst app/common/index.html pour inclure un formulaire de connexion et du code JavaScript afin de prendre en charge la réponse. Dans une démonstration, index.html inclut le code de l'exemple suivant :
    <!DOCTYPE HTML>
    <html>
        	<head>
        		<meta charset="UTF-8">
        		<title>index</title>
        		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
        		<link rel="shortcut icon" href="images/favicon.png">
        		<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
        		<link rel="stylesheet" href="css/main.css">
        		<script>window.$ = window.jQuery = WLJQ;</script>
        	</head>
        	<body id="content" style="display: none"> 
    		    <div id="AppBody">
    		        <div class="wrapper"> 
    		        </div>
    		    </div>
    		    <div id="AuthBody" style="display: none"> 
    		        <div id="loginForm"> 
    		            Username:<br/> 
    		            <input type="text" id="usernameInputField" autocorrect="off" autocapitalize="off" /><br /> 
    		            Password:<br/> 
    		            <input type="password" id="passwordInputField" autocorrect="off" autocapitalize="off"/><br/>		 
    		            <input type="button" id="loginButton" value="Login" /> 
    		            <input type="button" id="cancelButton" value="Cancel" /> 
    		        </div> 
    		    </div>
        		<!--application UI goes here-->
        		Hello Worklight
        		<script src="js/initOptions.js"></script>
        		<script src="js/main.js"></script>
        		<script src="js/messages.js"></script>
        		<script src="js/challengeResponse.js"></script>
        	</body>
    </html>
  12. Mettez à jour les options d'initialisation pour MobileFirst® afin de forcer l'application à se connecter au serveur MobileFirst® au démarrage en ajoutant la valeur WL.Client.connect(); dans MobileFirst Project/apps/mobilefirst app/common/js/main.js.
  13. Ajoutez JavaScript afin de traiter la réponse des serveurs MobileFirst® et HCL Portal. Dans cette application de démonstration de connexion unique, créez un fichier appelé challengeResponse.js, dans MobileFirst Project/apps/mobilefirst app/common/js. Ajoutez l'exemple ci-dessous au contenu du fichier. Mettez à jour la ligne goToPortalServer("http://server:port/wps/myportal"); pour qu'elle pointe vers votre serveur HCL Portal.
    /*
    *  Licensed Materials - Property of IBM
    *  5725-G92 (C) Copyright HCL Technologies Limited 2006, 2012, 2019. All Rights Reserved.
    *  US Government Users Restricted Rights - Use, duplication or
    *  disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
    */
    
    var sampleAppRealmChallengeHandler = WL.Client.createChallengeHandler("WASLTPARealm");
    var busyIndicator = new WL.BusyIndicator('content', {text: "Loading..."});
    
    sampleAppRealmChallengeHandler.isCustomResponse = function(response) {
        if (!response || response.responseText === null) {
            return false;
        }
        var indicatorIdx = response.responseText.search('j_security_check');
        
        if (indicatorIdx >= 0){
    		return true;
    	}  
    	return false;
    };
    
    sampleAppRealmChallengeHandler.handleChallenge = function(response) {
    	busyIndicator.show();
    	$('#AppBody').hide();
    	WL.EncryptedCache.open("wpsadmin", true, onReadOpen, onOpenError);
    };
    
    sampleAppRealmChallengeHandler.submitLoginFormCallback = function(response) {
        var isLoginFormResponse = sampleAppRealmChallengeHandler.isCustomResponse(response);
        if (isLoginFormResponse){
        	sampleAppRealmChallengeHandler.handleChallenge(response);
        } else {
        	$('#AppBody').show();
        	$('#AuthBody').hide();
        	sampleAppRealmChallengeHandler.submitSuccess();
        	WL.Client.getCookies().then(function (cookies) {
        		busyIndicator.hide();
        		goToPortalServer("http://server:port/wps/myportal");
        	});
        }
    };
    
    
    $('#loginButton').bind('click', function () {
    	busyIndicator.show();
    	WL.EncryptedCache.write("username", $('#usernameInputField').val(), onWriteSuccess, onWriteFailure);
    	function onWriteSuccess(status){
    		WL.EncryptedCache.write("password", $('#passwordInputField').val(), onWriteSuccess2, onWriteFailure);
    		function onWriteSuccess2(status2){
    			WL.EncryptedCache.close(onCloseCompleteHandler, onCloseFailureHandler);
    			
    		}
    	}
    	function onWriteFailure(status){
    		alert("Encrypted cache closed, writing failed");
    	}
    });
    
    
    function onCloseCompleteHandler(status){
    	var reqURL = '/j_security_check';
        var options = {};
        options.parameters = {
            j_username : $('#usernameInputField').val(),
            j_password : $('#passwordInputField').val()
        };
        options.headers = {};
        sampleAppRealmChallengeHandler.submitLoginForm(reqURL, options, sampleAppRealmChallengeHandler.submitLoginFormCallback);
    }
    
    
    function onCloseFailureHandler(status){
    	alert("close faiure");
    }
    
    
    $('#cancelButton').bind('click', function () {
    	sampleAppRealmChallengeHandler.submitFailure();
    	$('#AppBody').show();
    	$('#AuthBody').hide();
    });
    
    function onReadOpen(status){
    	WL.EncryptedCache.read("username", onDecryptReadSuccess, onDecryptReadFailure);
    	function onDecryptReadSuccess(value){
    		WL.EncryptedCache.read("password", onDecryptReadSuccess2, onDecryptReadFailure);
    		function onDecryptReadSuccess2(value2){
    			if (value && value2){
    				// submit 1 & 2
    				var reqURL = '/j_security_check';
    			    var options = {};
    			    options.parameters = {
    			        j_username : value,
    			        j_password : value2
    			    };
    			    options.headers = {};
    			    sampleAppRealmChallengeHandler.submitLoginForm(reqURL, options, sampleAppRealmChallengeHandler.submitLoginFormCallback);
    			} else {
    				// Didn't find any cached info, ask for login.
    				busyIndicator.hide();
    				$('#AuthBody').show();
    				$('#passwordInputField').val('');
    			}
    		}
    	}
    	function onDecryptReadFailure(status){
    		alert("Encrypted cache closed, reading failed");
    	}
    }
    
     function onOpenError(status){
    	switch(status){
    		case WL.EncryptedCache.ERROR_KEY_CREATION_IN_PROGRESS:
    			alert("ERROR: KEY CREATION IN PROGRESS");
    			break;
    		case WL.EncryptedCache.ERROR_LOCAL_STORAGE_NOT_SUPPORTED:
    			alert("ERROR: LOCAL STORAGE NOT SUPPORTED");
    			break;
    		case WL.EncryptedCache.ERROR_NO_EOC:
    			alert("ERROR: NO EOC");
    			break;
    		case WL.EncryptedCache.ERROR_COULD_NOT_GENERATE_KEY:
    			alert("ERROR: COULD NOT GENERATE KEY");
    			break;
    		case WL.EncryptedCache.ERROR_CREDENTIALS_MISMATCH:
    			alert("ERROR: CREDENTIALS MISMATCH");
    			break;
    		default:
    			alert("AN ERROR HAS OCCURED. STATUS :: " + status);
    	}
    }
  14. Créez un plug-in Cordova qui ajoute le jeton au magasin de cookies WebView afin que HCL Portal puisse recevoir le jeton LTPA d'une application Android.
    1. Créez un fichier Java appelé CookieInjector.java dans MobileFirst Project/apps/mobilefirst app/android/native/src/com/mobilefirst app. Ajoutez-lui le code suivant. Remplacez mobilefirst app par le nom de votre application.
      package com.mobilefirst_app;
      
      import java.util.List;
      
      import org.apache.cordova.CallbackContext;
      import org.apache.cordova.CordovaArgs;
      import org.apache.cordova.CordovaPlugin;
      import org.apache.http.client.CookieStore;
      import org.apache.http.cookie.Cookie;
      import org.json.JSONException;
      
      import android.webkit.CookieManager;
      
      import com.worklight.common.Logger;
      import com.worklight.wlclient.HttpClientManager;
      
      public class CookieInjector extends CordovaPlugin {
      	Logger l = Logger.getInstance(CookieInjector.class.getName());
      
      	@Override
      	public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {
      		if ("INJECT-COOKIES-TO-WEBVIEW".equals(action)){
      			l.debug("Started injecting cookies");
      
      			CookieStore cookieStore = HttpClientManager.getInstance().getHttpClient().getCookieStore();
      			List<Cookie> list = cookieStore.getCookies();
      			for (Cookie cookie : list){
      				String cookieName = cookie.getName();
      				l.debug("Found cookie :: " + cookieName);
      				if ("LtpaToken".equals(cookieName)){
      					l.debug("Found LtpaToken cookie");
      					CookieManager cookieManager = CookieManager.getInstance();
      					String cookieValue = cookie.getName() + "=" + cookie.getValue();
      					cookieManager.setCookie(cookie.getDomain(), cookieValue);
      					break;
      				}
      				l.debug("LtpaToken cookie not found");
      			}
      			l.debug("Done injecting cookies");
      			callbackContext.success();
      			return true;
      		}
      		return false;
      	}
      }
      
    2. Ajoutez le code suivant à MobileFirst Project/apps/mobilefirst app/android/native/res/xml/config.xml avant la balise </widget> fermante. Replace mobilefirst app with your app name.
      <feature name="CookieInjector">
          <param name="android-package" value="com.mobilefirst_app.CookieInjector" />
      </feature>
  15. Ajoutez la fonction suivante à MobileFirst Project/apps/mobilefirst app/android/apps/mobilefirst app/android/js/main.js.
    function goToPortalServer(url) {
    	cordova.exec(function () {
    		location.href = url;
    	}, function () {
    		alert('failure injecting cookies');
    	}, "CookieInjector", "INJECT-COOKIES-TO-WEBVIEW",[]);
    }
  16. Générez votre application MobileFirst® pour votre serveur MobileFirst® en cliquant avec le bouton droit de la souris sur l'application MobileFirst® et en sélectionnant Exécuter sous > Générer les paramètres et déployer la cible.
  17. Sélectionnez Générer l'application pour utiliser un autre serveur MobileFirst.
  18. Ajoutez les informations de votre serveur MobileFirst® aux zones Serveur et Chemin de contexte.
  19. Générez votre application en cliquant avec le bouton droit de la souris sur l'application MobileFirst® et en sélectionnant Exécuter sous > Générer les paramètres et déployer la cible.
  20. Installez l' application MobileFirst® sur votre serveur MobileFirst®. Ouvrez la console MobileFirst® sur http://server:port/worklightconsole et téléchargez l'application MobileFirst® en l'ajoutant à la zone Déployer l'application ou l'adaptateur. Votre fichier d'application MobileFirst® se trouve dans votre espace de travail Eclipse dans le dossier bin. Le fichier d'application MobileFirst® a l'extension .wlapp.