webiny / login
使用Webiny框架安全组件的登录应用程序。
Requires
- php: >=7.0
- webiny/framework: ~1.6 || dev-master
Requires (Dev)
- mybuilder/phpunit-accelerator: dev-master
- phpunit/phpunit: ~4
This package is not auto-updated.
Last update: 2024-09-14 18:09:37 UTC
README
这是一个为Webiny框架安全组件提供额外控制层的应用程序。该应用程序标准化了登录过程和用户无状态令牌存储,非常适合RESTful和移动应用程序。
一些内置功能
- 会话存储在数据库中,可以在任何时候撤销
- 授权设备也存储在数据库中,可以在任何时候撤销
- 基于客户端IP的登录白名单和黑名单
- 速率限制控制
- 为RESTful应用程序提供无状态登录验证
- 只有白名单设备可以登录(可选)
示例配置
Login: SecurityFirewall: Admin ValidateDevice: true BlockThreshold: 6 BlockTimelimit: 10 DeviceTtl: 90 RateLimitBlacklist: - 123.123.123.123 RateLimitWhitelist: - 127.0.0.1 - 192.168.1.1 - 10.0.2.2
- SecurityFirewall:定义用于用户认证的
Security.Firewall - ValidateDevice:设备是否需要在用户登录之前白名单化
- BlockThreshold:在多少次失败的登录尝试后,应该阻止客户端提交任何新的登录请求(客户端通过用户名+IP组合识别)
- BlockTimelimit:客户端应该被阻止多长时间才能提交任何额外的登录尝试
- DeviceTtl:设备会话应该有效多长时间(仅在ValidateDevice开启时使用)
- RateLimitBlacklist:永久阻止提交登录请求的IP列表
- RateLimitWhitelist:排除速率限制控制的IP列表
设置
登录应用程序需要以下Webiny框架组件
Mongo索引
在您的Mongo数据库上创建以下索引
db.getCollection('LoginMeta').createIndex({username: 1}); db.getCollection('LoginRateControl').createIndex({ip: 1});
示例设置
\Webiny\Component\Security\Security::setConfig('./securityConfig.yaml'); \Webiny\Component\Mongo\Mongo::setConfig('./mongoConfig.yaml'); \Webiny\Component\Entity\Entity::setConfig('./entityConfig.yaml'); $security = \Webiny\Component\Security\Security::getInstance(); $loginConfig = \Webiny\Component\Config\Config::getInstance()->yaml('./loginConfig.yaml'); $login = new \Webiny\Login\Login($security, $loginConfig);
一旦您有了登录实例,您可以直接访问类内的方法
// check if we have the auth cookie and device cookie $authCookie = \Webiny\Component\Http\Cookie::getInstance()->get('auth-token'); $deviceToken = \Webiny\Component\Http\Cookie::getInstance()->get('device-token'); if ($authCookie && $deviceToken) { try { $user = $login->getUser($authCookie, $deviceToken); } catch (\Webiny\Login\LoginException $le) { } catch (\Exception $e) { } }else{ // process login try { $login->processLogin($username, $deviceToken, $authProvider); // if login is successful, return device and auth tokens $authToken = $login->getAuthToken(); return [ 'authToken' => $authToken, 'deviceToken' => $deviceToken ]; } catch (LoginException $le) { $errorMsg = $le->getMessage(); } catch (\Exception $e) { return $e; } }
安全设置
请注意,安全组件需要实现Stateless令牌存储
Security: Tokens: Stateless: StorageDriver: \Webiny\Component\Security\Token\Storage\Stateless # storage driver needs to be set to stateless SecurityKey: SecretKey Firewall: Admin: Token: Stateless
登录服务
您可以通过扩展\Webiny\Login\LoginServices抽象类并将其实现到Webiny框架Rest组件中,将登录应用程序用作RESTful服务。(查看app/services.php文件夹中的示例实现)
POST processLogin
此方法处理登录请求,并返回登录错误或成功时返回authToken和deviceToken。
此方法通过POST接收以下参数
- 用户名
- 密码
- authProvider(可选 - 定义应用于处理请求的
Security.Firewall内的auth提供者名称) - deviceToken(可选 - 仅在ValidateDevice开启时需要)
登录错误代码
-
- 达到速率限制。
-
- 用户账户被阻止。
-
- 凭据无效。
-
- 用户尚未确认其账户。
-
- 当前设备不在允许列表中。
-
- 用户名或密码缺失。
POST getDeviceValidationToken
对于提供的用户名,返回deviceValidationToken。
设备验证令牌是可以通过电子邮件发送或通过短信或其他通信方式发送给用户的东西。
此方法通过POST接收以下参数
- 用户名
POST validateDeviceValidationToken
验证提供的deviceValidationToken和给定用户名。如果令牌匹配,则返回deviceToken。此设备令牌需要提供给processLogin方法,以通过ValidateDevice。
此方法通过POST接收以下参数
- 用户名
- deviceValidationToken
POST getAccountActivationToken
如果用户账户未激活,您需要请求一个激活令牌。通常,该令牌将通过激活链接以电子邮件形式发送给用户。
此方法通过POST接收以下参数
- 用户名
POST validateAccountActivationToken
验证提供的激活令牌的方法,要么返回成功消息,要么返回令牌无效的错误。
此方法通过POST接收以下参数
- 用户名
- accountActivationToken
POST logout
使给定用户的提供的认证令牌失效。
此方法通过POST接收以下参数
- 用户名
- authToken(由processLogin过程返回的认证令牌)
POST generateForgotPasswordResetToken
为给定的用户名生成一个忘记密码链接。
此方法通过POST接收以下参数
- 用户名
它不做什么
Login应用程序不
- 存储任何cookie或会话,因此所有
记住我功能都需要在您端完成 - 它不需要了解您的用户密码,这是通过
Security类完成的 - 不会发送任何链接,例如忘记密码、激活账户、2FA令牌——登录只生成令牌,交付取决于您
- 不执行任何授权,只进行认证
- 不提供任何视觉元素,只提供一个类和RESTful服务