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