2009-12-30 8 views
1

J'ai une application Java dont j'ai besoin pour intégrer notre site web PHP existant. Le fournisseur veut que nous effectuions une redirection côté serveur pour permettre une authentification sécurisée et une authentification unique, mais je ne suis pas sûr de savoir comment faire cela en PHP. Le vendeur a expliqué le flux de travail comme suit:Redirection côté serveur en PHP

  1. utilisateur clique sur un lien « Ouvrir l'application » sur notre site PHP
  2. L'application PHP frappe une page sur l'application Java, l'envoi des paramètres d'authentification
  3. En cas de succès , l'application PHP envoie les en-têtes au navigateur de l'utilisateur, ce qui oblige une « redirection », sinon l'application PHP affiche une erreur

cela permettra serait pour notre application PHP pour parler en toute sécurité à l'application Java , et le client n'a jamais à envoyer une sorte de authentification. D'après ce que je comprends, .NET et Java ont cette fonctionnalité intégrée, mais je ne trouve pas de solution en PHP pour le faire. Des idées?

MISE À JOUR

Je ne parle pas en utilisant l'en-tête ("Location: ..."); fonction pour faire une redirection. Le kicker avec cette redirection côté serveur est que l'application fait l'authentification et renvoie toutes ces informations au client pour que le client soit ensuite connecté. Utiliser l'en-tête ("Location: ...") force le navigateur à aller autre part.

UPDATE 2

autologin.php (simule l'utilisateur se connectant à une application externe par l'intermédiaire de boucle)

// The login 'form' is at login.php 
$ch = curl_init('http://domain.local/login.php'); 
// We are posting 2 variables, and returning the transfer just so it doesn't dump out 
// Headers are processed by the callback function processHeaders() 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'processHeaders'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, 'username=user&password=pass'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
// Execute curl, close the connection, and redirect the user to a 'restricted' page 
$response = curl_exec($ch); 
curl_close($ch); 
header("Location: http://domain.local/restricted.php"); 

function processHeaders($ch, $header) { 
    // Dump the response headers to the client 
    header($header); 
    strlen($header); 
} 

login.php (contient la forme 'login')

session_start(); 
if($_POST) { 
    if($_POST['username'] == 'user' && $_POST['password'] == 'pass') { 
     $_SESSION['auth'] = 1; 
     $_SESSION['token'] = md5(time()); 
    } else { 
     echo 'Auth failed'; 
    } 
} else { 
    echo 'Invalid access type'; 
} 

restricted.php (page à accès restreint)

session_start(); 
if($_SESSION['auth']) { 
    echo 'Secret Token: '.$_SESSION['token']; 
} else { 
    echo 'Please log in'; 
} 

L'idée est que l'utilisateur souhaite finalement accéder à 'restricted.php'. 'login.php' contient le code nécessaire pour se connecter. Ce que je veux simuler, c'est que l'utilisateur remplisse le formulaire 'login.php' et connecte l'utilisateur à 'restricted.php'. Les extraits de code ci-dessus fonctionnent ensemble sur mes tests locaux (en appuyant sur autologin.php redirige vers restricted.php et le jeton secret est imprimé), mais je n'arrive pas à faire fonctionner l'application croisée. Les applications seront sur le même domaine (https://domain.com/myapp, https://domain.com:1234/vendorapp).

Je ne l'ai jamais fait auparavant dans aucune langue, je suis juste en train de partir de ce que mon fournisseur m'a dit qu'ils ont fait. Apparemment, ils n'ont jamais traité avec PHP avant et n'ont aucune idée de ce qu'il faut faire.

+0

Re Mise à jour: Je ne comprends pas. Voulez-vous dire que l'application PHP "transmet" les en-têtes reçus de l'application Java au navigateur? Ensuite, le même principe s'appliquerait, vous définiriez les en-têtes avec 'header' et toute autre information dans le format requis dans le corps. – deceze

+0

Cela ne sonne-t-il pas qu'il parle d'un simple POST côté serveur? Lisez le numéro 2 de la question. – gahooa

+0

@deceze Alors utiliser cURL avec CURLOPT_HEADER => true et simplement jeter les informations d'en-tête au travail de l'utilisateur? – dragonmantank

Répondre

4

Vous venez sortir un HTTP normale redirigez header() comme ceci:

<?php header('Location: http://www.example.com/'); ?> 

Re Mise à jour

Si je comprends bien, vous auriez besoin de le faire:

  1. Browser POSTs demande de connexion au serveur PHP
  2. PHP scripts paquets les informations de connexion sous une forme spécifique pour l'application JSP
  3. script PHP POSTs (via cURL) ou SOAPs ou tout ce qui est nécessaire pour l'application JSP
  4. PHP reçoit la réponse et analyse les informations nécessaires
  5. PHP envoie en-tête et/ou des données de corps de nouveau au navigateur

L'étape 4, l'analyse des informations, dépend de la façon dont vous envoyez et recevez l'information. Si vous les recevez dans l'en-tête via cURL, vous devrez setCURLOPT_HEADER à true et analyser les données nécessaires hors de la réponse. Cela peut être aussi simple que de diviser la chaîne sur la première ligne vide ou plus compliqué, cela dépend de votre situation spécifique.

Comment cela se connecte-t-il à l'utilisateur en votre application est quelque chose que vous devez gérer également. L'application JSP gère probablement le mot de passe et le nom d'utilisateur et vous remet un jeton dont vous aurez besoin.

+0

L'utilisateur aura déjà authentifié dans mon application. Le fournisseur a dit qu'il n'y a pas de jeton échangé (nous avons un autre service tiers qui fait exactement cela, nous POSTONS un nom d'utilisateur/mot de passe secret et récupérons un jeton de connexion temporaire), nous postons simplement contre eux et repoussons les en-têtes navigateur client. – dragonmantank

+0

Ensuite, j'espère que les réponses ici vous donneront assez d'informations pour que cela fonctionne, sinon vous devrez expliquer plus en détail ce que vous voulez savoir. :) – deceze

+0

Peut-être que cela nous aiderait à nous dire exactement ce que vous feriez en .NET et Java, donc nous pouvons vous dire l'équivalent PHP. – deceze

6

comme ceci:

header("Location: http://www.example.com/") 

Mais il doit venir avant tout autre code ... voir php.net

2

On dirait que vous êtes à la recherche de la bibliothèque boucle, qui est habituellement empaqueté avec PHP.

http://php.net/manual/en/book.curl.php

<?php 
session_start(); 

// Receive username/password from $_POST 

// Prepare CURL object for post 

// Post u/p to java server 

// Read response 

if($success) 
{ 
    header('Location: nextpage.php'); 
    $_SESSION['LoggedInTime'] = time(); 
    exit; 
} 
else 
{ 
    //display error 
} 

Mise à jour:.

Plus tard, vous pouvez vérifier $_SESSION['LoggedInTime'] + 3600 > time() pour voir si elles sont toujours connectés chaque fois qu'ils visitent une connecté la page, faites ceci:

if($_SESSION['LoggedInTime'] + 3600 > time()) 
{ 
    $_SESSION['LoggedInTime'] = time() + 3600; 
} 
else 
{ 
    header('Location: /login.php?Message=session+expired'); 
    exit; 
} 

Espérons que cela aide.

+0

Comment puis-je faire en sorte que le client soit «connecté»? Est-ce que cela ne se connecte pas simplement à mon application en utilisant curl et pas à l'utilisateur lui-même? – dragonmantank

0

Si vous essayez d'intégrer php et java sur le web, vous voudrez peut-être regarder Quercus/Resin. Votre PHP peut alors appeler le code java directement. Comme ils s'exécutent sur le même serveur, le code java peut écrire des cookies, configurer des sessions ou effectuer un traitement d'installation nécessaire. http://www.caucho.com/resin-3.0/quercus/tutorial/module/index.xtp

+0

Malheureusement, ils ne résideront pas dans la même boîte, mais c'est quand même intéressant – dragonmantank