Autenticação Social
Ally é um provedor de autenticação social de primeira parte para AdonisJs.
Usar Ally torna trivial autenticar usuários por meio de sites de terceiros como Google, Twitter e Facebook.
O Ally Provider suporta os seguintes drivers:
- Facebook (
facebook
) - Github (
github
) - Google (
google
) - Instagram (
instagram
) - Linkedin (
linkedin
) - Twitter (
twitter
) - Foursquare (
foursquare
)
Configuração
Como o Ally Provider não é instalado por padrão, precisamos obtê-lo do npm:
adonis install @adonisjs/ally
Em seguida, registre o provedor dentro do arquivo start/app.js
:
// .start/app.js
const providers = [
'@adonisjs/ally/providers/AllyProvider'
]
NOTA
A configuração de autenticação social é salva dentro do arquivo config/services.js
, que é criado pelo comando adonis install
ao instalar o Ally Provider.
Config
Sua configuração deve ser armazenada dentro do objeto ally
do arquivo config/services.js
:
// .config/services.js
module.exports = {
ally: {
facebook: {}
}
}
DICA
Você sempre pode acessar o arquivo de origem da configuração mais recente no Github.
Exemplo básico
Vamos começar com um exemplo básico de login usando o Facebook.
Primeiro, precisamos registrar rotas para redirecionar o usuário para o Facebook e, em seguida, manipular a resposta quando o usuário for redirecionado de volta do Facebook:
// .start/routes.js
Route.get('login/facebook', 'LoginController.redirect')
Route.get('facebook/callback', 'LoginController.callback')
OBSERVAÇÃO
Certifique-se de que o Auth Provider e o middleware relacionado à autenticação estejam configurados corretamente.
Em seguida, precisamos criar o controlador para implementar nossos métodos de rota:
adonis make:controller Login
// .app/Controllers/Http/LoginController.js
const User = use('App/Models/User')
class LoginController {
async redirect ({ ally }) {
await ally.driver('facebook').redirect()
}
async callback ({ ally, auth }) {
try {
const fbUser = await ally.driver('facebook').getUser()
// user details to be saved
const userDetails = {
email: fbUser.getEmail(),
token: fbUser.getAccessToken(),
login_source: 'facebook'
}
// search for existing user
const whereClause = {
email: fbUser.getEmail()
}
const user = await User.findOrCreate(whereClause, userDetails)
await auth.login(user)
return 'Logged in'
} catch (error) {
return 'Unable to authenticate. Try again later'
}
}
}
Agora temos um sistema de login totalmente funcional em algumas linhas de código!
A API do Ally é consistente em todos os drivers, então é fácil trocar facebook
por google
ou qualquer outro driver necessário para seu aplicativo.
API do Ally
Abaixo está a lista de funções disponíveis.
redirect
Redirecionar usuário para o site de terceiros:
await ally.driver('facebook').redirect()
getRedirectUrl
Obter URL de redirecionamento de volta como uma string:
const url = await ally.driver('facebook').getRedirectUrl()
return view.render('login', { url })
scope(scopesArray)
Definir escopos de tempo de execução antes de redirecionar o usuário:
await ally
.driver('facebook')
.scope(['email', 'birthday'])
.redirect()
OBSERVAÇÃO
Verifique a documentação oficial do OAuth do provedor relevante para obter uma lista de seus escopos disponíveis.
fields(fieldsArray)
Campos a serem buscados ao obter o perfil de usuário autenticado:
await ally
.driver('facebook')
.fields(['username', 'email', 'profile_pic'])
.getUser()
getUser
Obtenha o perfil de usuário de um usuário autenticado (retorna uma instância AllyUser):
await ally
.driver('facebook')
.fields(['email'])
.getUser()
getUserByToken(accessToken, [accessSecret])
Retorna os detalhes do usuário usando o accessToken
:
await ally.getUserByToken(accessToken)
Isso é útil ao usar o código do lado do cliente para executar a ação OAuth e você tem acesso ao accessToken
.
OBSERVAÇÃO
O parâmetro accessSecret
é necessário quando o protocolo OAuth 1 é usado (por exemplo, o Twitter depende do OAuth 1).
API do usuário
Abaixo está a lista de métodos disponíveis em uma instância AllyUser.
getId
Retorna o ID do usuário:
const user = await ally.driver('facebook').getUser()
user.getId()
getName
Retorna o nome do usuário:
user.getName()
getEmail
Retorna o e-mail do usuário:
user.getEmail()
OBSERVAÇÃO
Alguns provedores de terceiros não compartilham e-mail, nesse caso esse método retorna null
.
getNickname
Retorna o apelido/nome de exibição do usuário:
user.getNickname()
getAvatar
Retorna a URL pública para a foto do perfil do usuário:
user.getAvatar()
getAccessToken
Retorna o token de acesso que pode ser usado posteriormente para atualizar o perfil do usuário:
user.getAccessToken()
getRefreshToken
Token de atualização a ser usado quando o token de acesso expirar:
user.getRefreshToken()
OBSERVAÇÃO
Disponível somente quando o provedor terceirizado implementa OAuth 2.
getExpires
Dados de expiração do token de acesso:
user.getExpires()
OBSERVAÇÃO
Disponível somente quando o provedor terceirizado implementa OAuth 2.
getTokenSecret
Retorna o segredo do token:
user.getTokenSecret()
OBSERVAÇÃO
Disponível somente quando o provedor terceirizado implementa OAuth 1.
getOriginal
Payload original retornado pelo provedor terceirizado:
user.getOriginal()