Адаптер Flysystem/sftp с двухфакторной аутентификацией: ключ И пароль

Есть ли у кого-нибудь недавний опыт работы с phpseclib/Flysystem/SFTP в двухфакторной аутентификации (закрытый ключ и пароль)?

Я только вчера столкнулся с этой проблемой, и мне нужно исправить. Мои поиски привели меня к:

Ему уже 3 года, а phpseclib до сих пор не исправлен — или нет?

Есть ли способ заставить это работать без изменения базовой библиотеки?

Использование: "league/flysystem-sftp": "~1.0-stable", который использует "phpseclib/phpseclib": "~2.0"


person guice    schedule 28.08.2016    source источник


Ответы (2)


Вот решение, которое я нашел. И это на самом деле довольно просто.

Я следую идее @neubert по двойной аутентификации: расширил SftpAdapter и перегрузил метод login():

<?php
use LogicException;

/**
 * Class SftpAdapter
 *
 * We're going to overload SftpAdapter in order to fix a bug handling key AND password authentication
 *
 * @package App\MyPackage
 */
class SftpAdapter extends \League\Flysystem\Sftp\SftpAdapter
{
    /**
     * Login.
     *
     * @throws LogicException
     */
    protected function login()
    {
        if (! $this->connection->login($this->username, $this->getPrivateKey())
            && ! $this->connection->login($this->username, $this->getPassword())) {
            throw new LogicException('Could not login with username: '.$this->username.', host: '.$this->host);
        }
    }

}

Теперь. Оно работает. Недостаток здесь в том, что теперь вы зависите от SftpAdapter (т.е. без инъекций). Но, поскольку это очень специфический вариант использования, мы можем с этим работать.

person guice    schedule 29.08.2016
comment
Хорошая работа! Кажется, стоит открыть тикет на github с разработчиками flysystem. - person neubert; 29.08.2016

Я ответил на этот вопрос три года назад и до сих пор даю тот же ответ.

Довольно редко серверы SFTP используют аутентификацию как по паролю, так и по открытому ключу. Я предполагаю, что у вас, скорее всего, есть закрытый ключ, защищенный паролем. Если это так, вы можете войти в систему следующим образом:

<?php
include('Net/SFTP.php');
include('Crypt/RSA.php');

$sftp = new Net_SFTP('www.domain.tld');
$key = new Crypt_RSA();
$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key)) {
    exit('Login Failed');
}

print_r($sftp->nlist());
?>

Если действительно ваш сервер действительно выполняет следующие действия:

<?php
include('Net/SFTP.php');
include('Crypt/RSA.php');

$sftp = new Net_SFTP('www.domain.tld');
$key = new Crypt_RSA();
$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key) && !$sftp->login('username', 'password')) {
    exit('Login Failed');
}

print_r($sftp->nlist());
?>

Обратите внимание, что это для версии 1.0. Если вы используете версию 2.0, код нужно будет несколько изменить. Поскольку вы не опубликовали свой собственный код, невозможно узнать, какую версию вы используете.

Кроме того, при просмотре этого поста 3,5-летней давности... похоже, что были проблемы, но теперь эти проблемы должны быть исправлены. Я без проблем выполнил многофакторную аутентификацию с помощью phpseclib. У вас есть основания полагать, что это не работает?

редактировать: для 2.0 вам нужно сделать это:

Для 2.0 вам нужно сделать это:

$sftp = new SFTP('www.domain.tld');
$key = new RSA();
//$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key) && !$sftp->login('username', 'password')) {
    exit('Login Failed');
}

print_r($sftp->nlist());
person neubert    schedule 29.08.2016
comment
Это аутентификация по паролю и ключу. Я точно знаю, что они используют метод аутентификации с открытым ключом и паролем. И тот факт, что я тот, кто фактически создал ключ. Это беспарольный ключ. Я проверил/воспроизвел проблему в библиотеке, изменив свой личный сервер, чтобы использовать открытый ключ, пароль - person guice; 29.08.2016
comment
Кроме того: с использованием лиги/flysystem-sftp: ~1.0-stable, который использует phpseclib/phpseclib: ~2.0. - person guice; 29.08.2016
comment
@ guice666 - я слишком много думаю о лиге / flysystem-sftp, но я, тем не менее, обновил свой пост, чтобы показать, как вы можете это сделать с phpseclib 2.0. - person neubert; 29.08.2016
comment
Спасибо. Я добавил решение Flysystem (выше/ниже? где-то!). Это еще проще. Спасибо за предложение / предупреждение. - person guice; 29.08.2016