Î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.