Есть ли у кого-нибудь недавний опыт использования phpseclib / Flysystem / SFTP в двухфакторной аутентификации (закрытый ключ и пароль)?
Я только вчера столкнулся с этой проблемой, и мне нужно исправить. Мои поиски привели меня к:
Ему 3 года, а phpseclib все еще не исправлен — или это так?
Есть ли способ заставить это работать без изменения базовой библиотеки?
Использование: «league / flysystem-sftp»: «~ 1.0-stable», которое использует «phpseclib / phpseclib»: «~ 2.0»
я ответил на этот вопрос три года назад, и я все еще дал бы тот же ответ.
Редко 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());
Вот решение, которое я нашел. И это на самом деле довольно просто.
Я следую идее @ 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 (т.е. без возможности инъекции). Но, поскольку это очень конкретный вариант использования, мы можем работать с этим.