Az előző epizódban láthattuk, hogy egészen egyszerűen és olvashatóan össze lehet rakni egy web szolgáltatást PHP-val, de azzal az volt a gond, hogy bárki használhatta a service-t, nem volt korlátozva az elérhetősége.
Éppen ezért megnézzük, mit lehet tenni az ellen, hogy illetéktelen lepjék el a webszerverünket, alkalmazásunkat.
Azért, hogy elsőre ne bonyolítsuk a dolgokat, nézzük meg a legegyszerűbbet: Basic Authentication Scheme
Most, hogy már mindent tudunk (kérés --> hát te ki vagy --> én vagyok!), lássuk, mit tudunk kihozni, hogy egyszerű legyen használnunk:
<?php
/* namespace játék */
class SvcController extends WebService {
public static function __static() {
typeof(__CLASS__)->Attributes()->MethodAttributes()->Add("Method1", new Operation(typeof(new InPut()), "method1 leírása"))->Add("VoidMethod", new Operation());
}
protected function _authenticateBy() {
return new BasicServiceAuthenticator();
}
protected function _onAuthenticating(AuthenticationRequest $authRequest) {
$authRequest->SetAuthenticated($authRequest->Password() == "password");
}
public function Method1(InPut $in) {
/* ... */
return $out;
}
public function VoidMethod() {
/* ... */
}
}
A service kódja megegyezik az első részben látottal, illetve majdnem, belekerült 2 plusz metódus:
protected function _authenticateBy() {
return new BasicServiceAuthenticator();
}
protected function _onAuthenticating(AuthenticationRequest $authRequest) {
$authRequest->SetAuthenticated($authRequest->Password() == "password");
}
_authenticateBy()
- visszaed egy IServiceAthenticator-t implementáló típusú objektumot
- ami képes arra, hogy építsen számunkra egy AuthenticationRequest instance-t az elérhető adatokból
- és képes intézkedni abban az esetben, amikor ismeretlen számunkra a kliens (a példában szerepló basic megoldás összesen 2 header-t küld ki ekkor)
_onAuthenticating()
- akkor hívódik meg, mikor autentikációs feladatunk akad, mérsékelten izgalmas a dolog, jelenleg a következő adatokat kaphatjuk megy egy AuthenticationRequest instance-ban: name, password, sessionId, other data (array())
- bármilyen logikát implementálhatunk itt, a lényeg a SetAuthenticated() meghívása true/false paraméterrel, a példában csak a jelszónak kell helyesnek lennie
Azt hiszem, ha valakinek így kellene egy service-t írnia, nem sok gondja lenne. Következőkben majd megpróbálom meghegeszteni a digest típusút is, illetve, ami gondot okoz, ha a SOAP üzenetben van valami, amire szükség van, azt hogyan tudom kinyerni, és felhasználni autentikációkor.