Autenticação social via Ally
O Ally é um provedor de autenticação social para AdonisJs. Ele torna super fácil autenticar usuários por meio de sites de terceiros como Facebook, Twitter, Google, etc. com o mínimo de esforço.
Drivers
Abaixo está a lista de drivers oficialmente suportados, enquanto você é livre para contribuir e adicionar mais.
- Facebook (facebook)
- Google (google)
- Twitter (twitter)
- Github (github)
- LinkedIn (linkedin)
- Instagram (instagram)
- Four Square (foursquare)
Sobre o Ally
- O Ally é um provedor primário instalado e configurado para adicionar suporte para autenticação social.
- Você precisa definir a configuração dentro do arquivo
config/services.js
. A configuração inclui um ID do cliente, Segredo e o URI de redirecionamento. - O Ally anexará um objeto chamado
ally
à instância request para que você possa acessar os métodos dentro dos seus controladores.
Configuração
Vamos começar com o processo de configuração, que é incrivelmente simples como sempre.
npm i --save adonis-ally
// bootstrap/app.js
const providers = [
// ...
'adonis-ally/providers/AllyProvider'
// ...
]
// app/Http/kernel.js
const globalMiddleware = [
// ...
'Adonis/Middleware/Ally'
// ...
]
Depois que o processo de configuração for concluído com sucesso, você poderá autenticar seus usuários usando seus perfis sociais.
Config
A configuração para ally é definida dentro do arquivo config/services.js
. Você pode copiar a configuração de exemplo do github.
// config/services.js
module.exports = {
ally: {
// Configuração para facebook
facebook: {
clientId: '',
clientSecret: '',
redirectUri: ''
},
// Configuração para github
github: {
clientId: '',
clientSecret: '',
redirectUri: ''
}
}
}
Exemplo básico
Vamos começar com o exemplo básico de Login com o Facebook, onde autenticaremos os usuários usando o Facebook e criaremos suas contas de usuário sem uma senha.
OBSERVAÇÃO
Certifique-se de ter definido a configuração necessária para o Facebook dentro do arquivo config/services.js
.
// Registrando Rotas
const Route = use('Route')
Route.get('facebook/login', 'LoginController.redirect')
Route.get('facebook/authenticated', 'LoginController.handleCallback')
// Redirecionando o usuário para o provedor
// Primeiro, precisamos redirecionar o usuário para o Facebook para permitir que nosso aplicativo acesse seu perfil.
class LoginController {
* redirect (request, response) {
yield request.ally.driver('facebook').redirect()
}
}
// Lidando com o retorno de chamada do provedor
const User = use('App/Model/User')
class LoginController {
* handleCallback (request, response) {
const fbUser = yield request.ally.driver('facebook').getUser() <1>
const searchAttr = {
email: fbUser.getEmail()
}
const newUser = {
email: fbUser.getEmail(),
avatar: fbUser.getAvatar(),
username: fbUser.getName()
}
const user = yield User.findOrCreate(searchAttr, newUser) <2>
request.auth.loginViaId(user.id) <3>
}
}
- O método
getUser
buscará o perfil do usuário para o provedor fornecido. Este método só funciona quando o usuário foi redirecionado de volta para oredirectUri
. - O
findOrCreate
é um método lúcido para encontrar um usuário com detalhes do usuário ou criar um novo usuário se não for possível encontrá-lo. - Finalmente, efetuamos login no usuário usando seu
id
.
Métodos Ally
Abaixo está a lista de métodos disponíveis expostos pelo provedor Ally.
driver
Selecione o driver
request.ally.driver('facebook')
redirect
Redireciona o usuário para o site do provedor
yield request.ally.driver('facebook').redirect()
getRedirectUrl
Retorna a URL de redirecionamento para um determinado provedor
yield request.ally.driver('facebook').getRedirectUrl()
scope
Atualiza os escopos a serem usados para pedir permissão.
yield request.ally.driver('facebook')
.scope(['public_profile', 'email', 'user_friends'])
.redirect()
getUser
Retorna o perfil do usuário para um determinado provedor
yield request.ally.driver('facebook').getUser()
fields
Defina campos personalizados ao tentar acessar o perfil do usuário.
yield request.ally.driver('facebook')
.fields(['email', 'verified']) <1>
.getUser()
OBSERVAÇÃO
Certifique-se de acessar campos adicionais usando o método getOriginal na instância do usuário.
Métodos do usuário
Abaixo está a lista de métodos a serem usados para buscar detalhes do perfil do usuário. Todos esses métodos são chamados em Instância do usuário retornada por getUser.
getName
const user = yield request.ally.driver('facebook').getUser()
user.getName()
getEmail
const user = yield request.ally.driver('facebook').getUser()
user.getEmail()
getNickname
const user = yield request.ally.driver('facebook').getUser()
user.getNickname()
getAvatar
const user = yield request.ally.driver('facebook').getUser()
user.getAvatar()
getAccessToken
const user = yield request.ally.driver('facebook').getUser()
user.getAccessToken()
getRefreshToken
Retorna o token de atualização a ser usado quando o token de acesso tiver expirado. Ele só é retornado ao usar OAuth2, e o provedor suporta expiração de token de acesso.
const user = yield request.ally.driver('facebook').getUser()
user.getRefreshToken()
getExpires
Tempo de expiração do token de acesso em milissegundos. Ele só é retornado ao usar OAuth2, e o provedor suporta expiração do token de acesso.
const user = yield request.ally.driver('facebook').getUser()
user.getExpires()
getTokenSecret
Retorna o segredo do token de acesso. Ele só é retornado ao usar OAuth1.
DICA
O Twitter é o único driver que faz uso do OAuth1.
const user = request.ally.driver('twitter').getUser()
user.getTokenSecret()
getOriginal
Retorna a resposta original do provedor.
const user = request.ally.driver('twitter').getUser()
user.getOriginal()