PHP na Windows Azure - AppFabric dla programistów PHP Udostępnij na: Facebook

Autor: Maciej Wilgucki

Opublikowano: 2011-05-17

Pobierz i uruchom

Windows Azure AppFabric jest technologią umożliwiającą skomunikowanie ze sobą dwóch odseparowanych od siebie systemów, nawet takich, które znajdują się za firmowym firewallem lub NAT-em. Mogą to być na przykład:

  • dwa (lub więcej) systemy intranetowe wymieniające między sobą dane,
  • klienckie aplikacje (desktop, telefon) łączące się między sobą przez chmurę,
  • aplikacja (aplikacje) w chmurze komunikująca się z aplikacją kliencką (desktop, telefon),
  • dowolna kombinacja powyższych aplikacji.

Windows Azure AppFabric składa się z dwóch elementów – szyna danych (service bus) oraz Acess Control Service (ACS). Szyna danych jest kanałem łączności, przez który komunikują się ze sobą systemy. Innymi słowy, szyna danych zestawia połączenie między dwoma systemami, niezależnie od tego, czy znajdują się one za firewallem, NAT-em, w chmurze czy na telefonie.

Access Control Service jest mechanizmem odpowiadającym za bezpieczeństwo szyny danych, bazującym na tokenach oraz claims (uprawnieniach). Zasada działania ACS jest prosta. Autoryzacja użytkownika następuje w serwisie o nazwie Identity Provider (IP), który zwraca token wraz z claims, czyli zbiorem informacji o danym użytkowniku. Mogą to być login, e-mail, imię oraz prawa dostępu. Tak wygenerowany token dostarczany jest następnie do aplikacji, z której użytkownik chce korzystać. Jeśli aplikacja ufa IP, wówczas użytkownik może zalogować się do strony. Jako przykład Identity Provider może posłużyć Windows Live ID.

Implementacja

Do pracy z Windows Azure AppFabric będziemy potrzebowali AppFabric SDK for PHP. Jest to jak na razie jedyna biblioteka pozwalająca na wygodne korzystanie z AppFabric z poziomu PHP. Biblioteka oraz dokumentacja do niej znajduje się pod adresem http://dotnetservicesphp.codeplex.com/.

Tworzenie szyny danych i Access Control Service (ACS)

Zanim zaczniemy korzystać z AppFabric, musimy utworzyć odpowiednie konto:

1. Logujemy się do panelu administracyjnego Windows Azure – https://windows.azure.com/.

2. Z lewego menu wybieramy opcję Service Bus, Access Control &Caching (rys. 1).

Rys. 1. Tworzenie szyny danych i ACS – krok 1.

3. W górnym menu klikamy w opcję New Namespace (rys. 2):

Rys. 2. Tworzenie szyny danych i ACS, krok 2.

4. Uzupełniamy formularz (rys. 3). Ponieważ będziemy korzystać z ACS, zaznaczamy zarówno Service Bus, jak i Access Control.

Rys. 3. Formularz tworzenia nowej przestrzeni nazw.

Jedyną istotną z punktu widzenia aplikacji informacją jest nazwa przestrzeni nazw, z jakiej będziemy korzystać. Nazwa ta będzie później wykorzystywana podczas łączenia się z szyną danych oraz ACS. Nazwa przestrzeni może składać się z 5–50 znaków alfanumerycznych, przy czym pierwszym znakiem musi być litera.

5. Zatwierdzamy zmiany przyciskiem Create Namespace.

Po utworzeniu nowej przestrzeni nazw musimy odczekać kilka minut, aż stanie się aktywna.

Mając tak przygotowaną szynę danych, możemy przejść do jej wykorzystania.

Korzystanie z szyny danych

1. Zaczniemy od zdefiniowania stałych, które będą przechowywać niezbędne informacje. Nic nie stoi na przeszkodzie, aby zapisać je w pliku konfiguracyjnym, bazie danych lub dowolnym innym źródle danych.

// nazwa przestrzeni nazw zdefiniowana podczas tworzenia szyny danych
define('ACS_TRUSTED_SERVICE', 'nazwaprzestrzeni');
// nazwa użytkownika
define('ACS_TRUSTED_ISSUER', 'issuer');
// klucz
define('ACS_TRUSTED_SECRET_KEY', 'abc123');
// adres usługi
define('REQUEST_URI_STR', 'https://nazwaprzestrzeni.servicebus.windows.net/');

2. Wszystkie powyższe informacje można odnaleźć w panelu administracyjnym w sekcji Properties. Nazwa użytkownika oraz klucz są dostępne pod nazwą DefaultKey, a adres usługi pod nazwą Service Gateway.

Następnie musimy utworzyć zasięg (scope), który określi, do jakiej przestrzeni nazw będziemy mieli dostęp. Wykorzystamy w tym celu utworzone wcześniej stałe. Stała SHARED_SECRET została zdefiniowana w bibliotece w pliku constants.inc. Zalecana jest zmiana jej wartości na taką, którą będziemy znać tylko my.

$scope = new Scope(SHARED_SECRET);
$scope->setIssuerName(ACS_TRUSTED_ISSUER);
$scope->setIssuerSecret(ACS_TRUSTED_SECRET_KEY);
$scope->setServiceNamespaceDomain(ACS_TRUSTED_SERVICE);
$scope->setServiceURI(REQUEST_URI_STR);

3. Ostatnim krokiem będzie utworzenie buforu będącego pojemnikiem dla przesyłanych między aplikacjami wiadomości. Zanim utworzymy bufor, musimy utworzyć zbiór opisujących go reguł (policy):

$messageBufferName = 'nazwa_bufora';
$messageBufferUri = DotNetServicesEnvironment::getMessageBufferUri(
    'http',
    ACS_TRUSTED_SERVICE,
    $messageBufferName
);
// reguły opisujące bufor
$policy = new MessageBufferPolicy();
// utworzenie bufora
$client = new MessageBufferClient($messageBufferUri, $scope, $policy);
$response = $client->createMessageBuffer($policy);

Zmienna $response zawiera odpowiedź szyny danych. W tym miejscu możemy sprawdzić, czy udało się utworzyć bufor oraz podjąć niezbędne kroki w przypadku niepowodzenia.

Do tak przygotowanego bufora możemy wysłać wiadomość:

$client->sendMessage("Treść wiadomości");

„Po drugiej stronie" wiadomość może zostać w prosty sposób odczytana:

$client->getMessage();

Po zakończeniu pracy z buforem możemy go usunąć:

$client->DeleteMessageBuffer($policy);

Access Control Service

W przypadku ACS, SDK dla PHP umożliwia wykonanie następujących czynności:

1. Pobranie tokena:

$acmHostName = DotNetServicesEnvironment::getACMHostName();
$serviceName = 'nazwaprzestrzeni';

define('ACS_TRUSTED_ISSUER', 'issuer');
define('ACS_TRUSTED_SECRET_KEY', 'abc123');

$scope = new Scope('simpleAPIAuth');
$scope->setIssuerName(ACS_TRUSTED_ISSUER);
$scope->setIssuerSecret(ACS_TRUSTED_SECRET_KEY);
$scope->setAppliesTo('http://af/');

$simpleApiAuthService = new SimpleApiAuthService($acmHostName, $serviceName);
$simpleApiAuthService->setScope($scope);
$token = $simpleApiAuthService->getACSToken();

echo $token;

Na samym początku określamy zasięg, w jakim będziemy pracować. Podobnie jak w przypadku szyny danych, musimy podać zdefiniowaną przez nas nazwę przestrzeni nazw. Nazwę użytkownika oraz klucz znajdziemy w panelu administracyjnym naszej przestrzeni nazw (rys. 4), w menu Management Service.

Rys. 4. Zarządzanie ACS.

Ostatnią wartością, jaką przekazujemy do obiektu Scope, jest adres aplikacji korzystającej z ASC. Adres ten musimy zdefiniować w panelu administracyjnym ACS w menu Relying Party Applications.

Pozostały kod jest odpowiedzialny za połączenie się z ACS i uzyskanie tokena.

2. Walidacja tokena.

Podczas pracy nad aplikacją może zajść potrzeba przeprowadzenia walidacji tokena pochodzącego z aplikacji klienckiej. Do przeprowadzenia walidacji będziemy potrzebowali klucza autoryzacyjnego, który znajdziemy w panelu administracyjnym w menu    Certificates and Keys:

$serviceName = 'nazwaprzestrzeni';
$token = 'token123';
$signingKey = 'klucz123';

$tokenValidator = new TokenValidator($serviceName, 'http://af/', $signingKey, $token);
$isValid = $tokenValidator->validate();

var_dump($isValid);

3. Walidacja uprawnień

Ostatnią czynnością, jaką możemy wykonać w ramach ACS, jest walidacja uprawnień:

$serviceName = 'nazwaprzestrzeni';
$signingKey = 'klucz123';

$requiredClaims = array('zasob' =>true);
$isValid = ValidateClaimUtil::ValidateClaims($requiredClaims, $serviceName, 'http://af/', $signingKey);

var_dump($isValid);

Podsumowanie

Zapoznaliśmy się dzisiaj z możliwościami oferowanymi przez AppFabric SDK for PHP. Dzięki AppFabric mamy możliwość tworzenia rozproszonych aplikacji, korzystających z jednego mechanizmu autoryzacji i autentykacji. Co więcej, możemy skomunikować ze sobą aplikacje, które nie muszą być dla siebie widoczne. Niestety, SDK dla PHP nie pozwala w pełni skorzystać z możliwości oferowanych przez Windows Azure AppFabric, dlatego też zachęcam do zapoznania się z dokumentacją szyny danych (https://msdn.microsoft.com/en-us/library/dd582728.aspx) oraz ACS (https://msdn.microsoft.com/en-us/library/dd582744.aspx).