2016-08-28 3 views
1

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

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

Это 3years старый, и phpseclib до сих пор, кажется, не фиксируется - или это?

В любом случае, чтобы получить эту работу без изменения базовой библиотеки?

Использование: "лига/flysystem-SFTP": "~ 1,0 стабильный", который использует "phpseclib/phpseclib": "~ 2,0"

ответ

1

Я answered that question три года назад, и я до сих пор дать тот же ответ ,

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

<?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-летнего поста ... похоже, что есть проблемы, но эти проблемы теперь должны быть исправлены. Я сделал многофакторный auth сам с 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()); 
+0

Это аутентификация с паролем и ключом. Я знаю, что они используют метод аутентификации «publickey, password». И тот факт, что я тот, кто на самом деле создал ключ. Это ключ без пароля. Я проверил/реплицировал проблему в библиотеке, изменив свой личный сервер, чтобы использовать «publickey, password» – guice

+0

Кроме того: с использованием «лиги/flysystem-sftp»: «~ 1.0-stable», в которой используется «phpseclib/phpseclib», : "~ 2.0". – guice

+0

@ guice666 - idk too much о лиге/flysystem-sftp, но я ничего не обновил свой пост, чтобы показать, как вы это сделаете с помощью phpseclib 2.0. – neubert

1

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

Я следую за идею @ Нойберт путем двойной аутентификации: продлила SftpAdapter и перегруженный метод Логин():

<?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 (то есть без инъекций). Но, поскольку это очень конкретный прецедент, мы можем работать с этим.

+0

Хорошая работа! Кажется, что открытие билета на github с помощью разработчиков flysystem может оказаться полезным – neubert

 Смежные вопросы

  • Нет связанных вопросов^_^