具有双因素身份验证的Flysystem / sftp适配器:密钥和密码

时间:2016-08-28 01:41:05

标签: php sftp phpseclib flysystem

有没有人在双因素身份验证(私钥和密码)中有最近的phpseclib / Flysystem / SFTP经验?

我昨天遇到了这个问题,需要修复。我的搜索引导我:

它已经3岁了,而且phpseclib似乎还没有被修复 - 或者是它?

无论如何都可以在不修改基础库的情况下使其工作吗?

使用:" league / flysystem-sftp":" ~1.0-stable",它使用" phpseclib / phpseclib":" ~2.0& #34;

2 个答案:

答案 0 :(得分:1)

三年前我answered that question我仍会给出同样的答案。

  

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());

答案 1 :(得分:1)

这是我找到的解决方案。它实际上非常简单。

我正在通过双重身份验证来关注@ 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(即没有可注射性)。但是,由于这是一个非常具体的用例,我们可以使用它。