108 lines
3.1 KiB
PHP
108 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace Vanguard\Services\Auth\TwoFactor;
|
|
|
|
use Exception;
|
|
use GuzzleHttp\Client as HttpClient;
|
|
use Vanguard\Services\Auth\TwoFactor\Contracts\Provider;
|
|
use Vanguard\Services\Auth\TwoFactor\Contracts\Authenticatable as TwoFactorAuthenticatable;
|
|
|
|
class Authy implements Provider
|
|
{
|
|
/**
|
|
* Determine if the given user has two-factor authentication enabled.
|
|
*
|
|
* @param TwoFactorAuthenticatable $user
|
|
* @return bool
|
|
*/
|
|
public function isEnabled(TwoFactorAuthenticatable $user)
|
|
{
|
|
$options = $user->getTwoFactorAuthProviderOptions();
|
|
|
|
return isset($options['enabled']) && $options['enabled'] === true;
|
|
}
|
|
|
|
/**
|
|
* Register the given user with the provider.
|
|
*
|
|
* @param TwoFactorAuthenticatable $user
|
|
*/
|
|
public function register(TwoFactorAuthenticatable $user)
|
|
{
|
|
$key = config('services.authy.key');
|
|
|
|
$response = json_decode((new HttpClient)->post('https://api.authy.com/protected/json/users/new?api_key='.$key, [
|
|
'form_params' => [
|
|
'user' => [
|
|
'email' => $user->getEmailForTwoFactorAuth(),
|
|
'cellphone' => preg_replace('/[^0-9]/', '', $user->getAuthPhoneNumber()),
|
|
'country_code' => $user->getAuthCountryCode(),
|
|
],
|
|
],
|
|
])->getBody(), true);
|
|
|
|
$user->setTwoFactorAuthProviderOptions([
|
|
'id' => $response['user']['id'],
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function sendTwoFactorVerificationToken(TwoFactorAuthenticatable $user)
|
|
{
|
|
$key = config('services.authy.key');
|
|
|
|
$options = $user->getTwoFactorAuthProviderOptions();
|
|
|
|
$response = json_decode((new HttpClient)->get(
|
|
'https://api.authy.com/protected/json/sms/'.$options['id'].'?force=true&api_key='.$key
|
|
)->getBody(), true);
|
|
|
|
return $response['success'] === true;
|
|
}
|
|
|
|
/**
|
|
* Determine if the given token is valid for the given user.
|
|
*
|
|
* @param TwoFactorAuthenticatable $user
|
|
* @param string $token
|
|
* @return bool
|
|
*/
|
|
public function tokenIsValid(TwoFactorAuthenticatable $user, $token)
|
|
{
|
|
try {
|
|
$key = config('services.authy.key');
|
|
|
|
$options = $user->getTwoFactorAuthProviderOptions();
|
|
|
|
$response = json_decode((new HttpClient)->get(
|
|
'https://api.authy.com/protected/json/verify/'.$token.'/'.$options['id'].'?force=true&api_key='.$key
|
|
)->getBody(), true);
|
|
|
|
return $response['token'] === 'is valid';
|
|
} catch (Exception $e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Delete the given user from the provider.
|
|
*
|
|
* @param TwoFactorAuthenticatable $user
|
|
* @return bool
|
|
*/
|
|
public function delete(TwoFactorAuthenticatable $user)
|
|
{
|
|
$key = config('services.authy.key');
|
|
|
|
$options = $user->getTwoFactorAuthProviderOptions();
|
|
|
|
(new HttpClient)->post(
|
|
'https://api.authy.com/protected/json/users/delete/'.$options['id'].'?api_key='.$key
|
|
);
|
|
|
|
$user->setTwoFactorAuthProviderOptions([]);
|
|
}
|
|
}
|