(trabalho em andamento: documentos para 2.0)
Biblioteca para tratamento da identificação do usuário.
O objetivo desta biblioteca é localizar a conta do usuário (para ser mais preciso - seu ID exclusivo) para uma determinada prova de identidade e gerenciar vários tipos de identidades. É composto por 4 serviços distintos: Identificação, Registo, Busca e Recuperação.
Você pode adicionar a biblioteca ao seu projeto usando o compositor com o seguinte comando:
composer require teresko/ palladium
Para usar este pacote, é necessário PHP versão 7.0+ e PDO.
Você também precisará criar uma tabela, onde armazenar as identidades . O esquema de exemplo está disponível aqui. Atualmente contém apenas definição de tabela para MySQL/MariaDB, mas a biblioteca pode ser usada com qualquer RDBMS, que possua driver PDO.
palladium contém 4 serviços: Registration
, Identification
, Search
e Recovery
. Cada um desses serviços possui duas dependências obrigatórias:
palladium ContractCanPersistIdenity
)PsrLogLoggerInterface
)Isso lhe dá a opção de substituir o repositório padrão, se desejar alterar ou substituir partes da camada de abstração de persistência. Quanto ao logger - a abordagem recomendada é usar o Monolog, mas funcionaria com qualquer sistema de registro compatível.
O repositório padrão também vem com funcionalidade para adicionar tipos de identidade personalizados e mapeadores de dados, que são usados para seus tipos de identidade ou para os tipos de identidade integrados. Para detalhes de uso, consulte a seção %TODO%.
No construtor do serviço Identification
existe um terceiro e quarto parâmetros opcionais:
No construtor do serviço Registration
existe um terceiro parâmetro opcional:
Conforme observado acima, todos os 4 serviços esperam um repositório como uma dependência do construtor. Se você não estiver substituindo o repositório empacotado pela sua versão personalizada, você precisará inicializar palladium RepositoryIdentity
e passá-lo para os serviços.
O repositório incluído em si tem uma única dependência: instance, que implementa palladium ContractCanCreateMapper
. Este contrato (interface) é implementado por palladium ComponentMapperFactory
. E esta fábrica possui duas dependências: a instância PDO
e o nome da tabela, onde serão armazenadas as identidades .
<?php
$ factory = new palladium Component MapperFactory ( new PDO (... $ config ), $ tableName );
$ repository = new palladium Repository Identity ( $ factory );
Em todos os outros exemplos de código, onde você vê a variável $repository
usada, você pode assumir que ela foi inicializada usando este exemplo de código.
Para usuários do componente DependencyInjection do Symfony (versão: 3.4+), há um arquivo de configuração de exemplo: %TODO%
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Se a operação for concluída com sucesso, a variável $identity
conterá uma instância de StandardIdentity
não verificada. Para completar a verificação, você terá que usar o token que a identidade contém. No exemplo dado, este token pode ser avaliado usando $instance->getToken()
.
O método createStandardIdentity()
pode lançar a exceção IdentityConflict
, se o e-mail já tiver sido usado para outra identidade.
O método createStandardIdentity()
possui um terceiro parâmetro opcional, que define a vida útil do token de verificação de e-mail em segundos. Quando aplicado, o exemplo anterior fica assim:
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' , 3600 );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Isso tornará o token de verificação utilizável por 1 hora após o registro da identidade do usuário. Depois que esse tempo passar, você não conseguirá encontrar essa identidade usando findStandardIdentityByToken()
no serviço Search
.
IMPORTANTE : o método
createStandardIdentity()
não valida o email dos usuários ou qualquer outro tipo de identificador. Ele apenas verifica sua singularidade. A validação de e-mails, números de telefone, apelidos e outros identificadores está além do escopo desta biblioteca.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByToken ( $ token , palladium Entity Identity:: ACTION_VERIFY );
$ registration -> verifyStandardIdentity ( $ identity );
O valor $token
é usado para localizar o EmailIdentity
correspondente, que então é verificado. Se a identidade não for encontrada, findStandardIdentityByToken()
lançará a exceção IdentityNotFound
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ cookie = $ identification -> loginWithPassword ( $ identity , $ password );
Se não houver identidade correspondente com determinado identificador (como endereço de e-mail) encontrada, o método findStandardIdentityByIdentifier()
lançará a exceção IdentityNotFound
.
Caso a senha não corresponda, o método loginWithPassword()
lançará a exceção PasswordMismatch
.
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId );
Isto criará uma nova instância de NonceIdentity
. Para usá-lo para login, você precisará de valores em NonceIdentity::getIdentifier()
e NonceIdentity::getKey()
, onde o identificador será usado para localizar a identidade nonce e a chave será usada para verificar.
O método createNonceIdentity()
era um segundo parâmetro opcional, que define a vida útil dessa identidade de uso único em segundos. Quando aplicado, o exemplo anterior fica assim:
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId , 600 );
Isso tornará a identidade de uso único utilizável por 10 minutos após sua criação. Depois que o tempo permitido tiver passado, passar essa identidade no método useNonceIdentity()
de Identification
resultará no lançamento da exceção IdentityExpired
.
<?php
$ identity = $ this -> search -> findNonceIdentityByIdentifier ( $ identifier );
$ cookie = $ this -> identification -> useNonceIdentity ( $ identity , $ key );
Se não houver identidade correspondente com determinado identificador (endereço de e-mail, apelido, etc.) encontrada, o método findNonceIdentityByIdentifier()
lançará a exceção IdentityNotFound
.
Caso a senha não corresponda, o método useNonceIdentity()
lançará a exceção KeyMismatch
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ cookie = $ identification -> loginWithCookie ( $ identity , $ key );
Se o cookie não for encontrado usando findCookieIdentity()
uma exceção padrão IdentityNotFound
será lançada. A possível causa seria que o cookie não estivesse mais ativo (por exemplo, usuário desconectado) ou o cookie não existisse.
Caso o cookie seja muito antigo, loginWithCookie()
produzirá a exceção IdentityExpired
.
Mas o método loginWithCookie()
também pode produzir uma exceção CompromisedCookie
. Ver uma exceção para isso pode indicar que o cookie foi roubado ou que o usuário nunca recebeu um novo valor de cookie.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> blockIdentity ( $ identity );
Esta é a forma recomendada para lidar com cookies suspeitos, que podem ou não ser roubados. Isto não se destina a desconectar usuários .
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> logout ( $ identity , $ key );
Esta operação marca o cookie como “descartado”. A lista de exceções que podem ser produzidas corresponde às descritas na seção login usando cookies.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity );
Se não for encontrada nenhuma identidade correspondente com o endereço de e-mail fornecido, o método findStandardIdentityByIdentifier()
lançará a exceção IdentityNotFound
.
Quando markForReset()
é chamado, ele deve ser fornecido com uma instância de StandardIdentity
, que já foi verificada (caso contrário, pode vazar informações privadas do usuário de seu aplicativo). Se não for esse o caso, o método lançará a exceção IdentityNotVerified
.
O método markForReset()
era um segundo parâmetro opcional, que define a vida útil do token de redefinição de senha em segundos. Quando aplicado, o exemplo anterior fica assim:
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity , 7200 );
Isso tornará o token de redefinição de senha utilizável por duas horas após a identidade desse usuário ter sido marcada para redefinição. Quando o tempo permitido expirar, você não conseguirá encontrar essa identidade usando findEmailIdentityByToken()
no serviço Search
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findEmailIdentityByToken ( $ token , palladium Entity Identity:: ACTION_RESET );
$ recovery -> resetIdentityPassword ( $ identity , ' foobar ' );
Se não houver identidade correspondente com determinado token encontrado, o método findEmailIdentityByToken()
lançará a exceção IdentityNotFound
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ identification -> changePassword ( $ identity , $ oldPassword , $ newPassword );
Se não houver identidade correspondente com determinado endereço de e-mail (ou qualquer outro tipo de identificador) encontrada, o método findStandardIdentityByIdentifier()
lançará a exceção IdentityNotFound
.
Caso a senha não corresponda, o método changePassword()
lançará a exceção PasswordMismatch
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ factory , $ logger );
$ list = $ search -> findIdentitiesByParentId ( $ identity -> getId ());
$ identification -> discardIdentityCollection ( $ list );
O valor de retorno de findIdentitiesByParentId()
retornará IdentityCollection
, que pode estar vazio.
Conforme mencionado anteriormente, os serviços nesta biblioteca esperam um criador de logs compatível com PSR-3 como dependência. Ele será utilizado para registrar três níveis de eventos:
LogLevel::INFO
Este nível de log é usado para rastrear operações comuns que o usuário realizaria ao usar seu aplicativo da maneira pretendida:
LogLevel::NOTICE
Logs com este nível serão registrados, se o usuário tentar uma operação malsucedida, o que não deveria acontecer em cenários de uso corretos:
LogLevel::WARNING
Usado apenas para registrar casos, quando o usuário tentou usar um cookie comprometido.
Esta biblioteca se concentra em uma tarefa específica. Não inclui nenhuma das seguintes funcionalidades:
Se você acha que essa biblioteca de autenticação requer uma das partes listadas acima, então esta não é a biblioteca que você está procurando.