Î N A P O I
Înțelegerea Simple OAuth în Drupal: autentificare pentru aplicații decuplate

Înțelegerea Simple OAuth în Drupal: autentificare pentru aplicații decuplate

Ce este Simple OAuth?

Simple OAuth este un modul Drupal care oferă capacități de autentificare pentru aplicații decuplate. Implementează autentificarea bazată pe token-uri, permițând utilizatorilor să acceseze în siguranță aplicația prin intermediul token-urilor de acces, mai degrabă decât prin credențiale tradiționale de autentificare.

Fluxul de autentificare bazat pe token-uri

Procesul de autentificare urmează un sistem ierarhic de token-uri:

Token de acces: Credențialul principal de autentificare, generat ca un hash SHA-256 unic

Token de reîmprospătare: Utilizat pentru a genera noi token-uri de acces când acestea expiră

Autentificare de bază: Necesară când atât token-urile de acces, cât și cele de reîmprospătare expiră

Înțelegerea token-urilor de acces

Token-urile de acces sunt JWT (JSON Web Tokens) care conțin două componente cheie:

Claims Claims-urile stochează informații esențiale despre identitatea utilizatorului necesare aplicației client. În mod implicit, Simple OAuth include două claims:

mail: Adresa de email a utilizatorului

username: Numele de cont al utilizatorului

Scopes Scope-urile reprezintă rolurile utilizatorului în cadrul aplicației. Acestea determină ce acțiuni poate efectua un utilizator. Câteva aspecte importante despre scope-uri:

Rolurile multiple trebuie specificate cu spațiu între ele

Dacă nu este definit niciun scope, rolul 'authenticated' devine implicit

Token-ul final include atât scope-urile solicitate, cât și orice roluri suplimentare definite în ID-ul clientului

Extinderea claims-urilor token-urilor de acces

Pentru a adăuga claims-uri personalizate dincolo de cele implicite mail și username, trebuie să extinzi clasa AccessTokenEntity. Iată cum:

class MyAccessTokenEntity extends AccessTokenEntity { public function convertToJWT(CryptKey $privateKey) { $private_claims = []; \Drupal::moduleHandler() ->alter('simple_oauth_private_claims', $private_claims, $this); if (!is_array($private_claims)) { $message = 'An implementation of hook_simple_oauth_private_claims_alter ' . 'returns an invalid $private_claims value. $private_claims ' . 'must be an array.'; throw new \InvalidArgumentException($message); } $builder = (new Builder()) ->setAudience($this->getClient()->getIdentifier()) ->setId($this->getIdentifier(), TRUE) ->setIssuedAt(time()) ->setNotBefore(time()) ->setExpiration($this->getExpiryDateTime()->getTimestamp()) ->setSubject($this->getUserIdentifier()) ->set('scopes', $this->getScopes()); // Add custom claims here // Example: $builder->set('user_picture', ...); foreach ($private_claims as $claim_name => $value) { $builder->set($claim_name, $value); } $key = new Key($privateKey->getKeyPath(), $privateKey->getPassPhrase()); $token = $builder->sign(new Sha256(), $key)->getToken(); return $token; } }

Implementarea entității personalizate de token

Pentru a utiliza entitatea personalizată de token, va trebui să o înregistrezi în containerul de servicii al Drupal:

class MyServiceProvider extends ServiceProviderBase implements ServiceProviderInterface { public function alter(ContainerBuilder $container) { $definition = $container->getDefinition('simple_oauth.repositories.access_token'); $definition->setClass('Drupal\my_module\Repositories\MyAccessTokenRepository'); } }

Bune practici

Întotdeauna validați claims-urile private înainte de procesare

Luați în considerare cu atenție timpii de expirare a token-urilor pentru cazul dvs. de utilizare

Implementați gestionarea corespunzătoare a erorilor pentru generarea și validarea token-urilor

Documentați orice claims-uri personalizate adăugate în sistem

Monitorizați utilizarea token-urilor și implementați limitarea ratei dacă este necesar

Contactați-ne dacă aveți nevoie de ajutor.