agents->update_token_hash( $agent_id, hash( 'sha256', $token ) ); return $token; } /** * Revoke an agent's token. * * @param int $agent_id Agent id. */ public function revoke( int $agent_id ): void { $this->agents->update_token_hash( $agent_id, null ); } /** * Verify a presented bearer token. * * @param string $token Presented token. * @return Agent|null The active agent on success; null on any failure. */ public function verify( string $token ): ?Agent { if ( ! str_starts_with( $token, self::PREFIX ) ) { return null; } $presented_hash = hash( 'sha256', $token ); $agent = $this->agents->find_by_token_hash( $presented_hash ); if ( null === $agent || null === $agent->token_hash ) { return null; } if ( ! hash_equals( $agent->token_hash, $presented_hash ) ) { return null; } if ( 'active' !== $agent->status ) { return null; } return $agent; } }