有没有人在双因素身份验证(私钥和密码)中有最近的phpseclib / Flysystem / SFTP经验?
我昨天遇到了这个问题,需要修复。我的搜索引导我:
它已经3岁了,而且phpseclib似乎还没有被修复 - 或者是它?
无论如何都可以在不修改基础库的情况下使其工作吗?
使用:" league / flysystem-sftp":" ~1.0-stable",它使用" phpseclib / phpseclib":" ~2.0& #34;
答案 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(即没有可注射性)。但是,由于这是一个非常具体的用例,我们可以使用它。