firehed / auth
身份验证工具集
Requires
- php: >=7
- firehed/common: ^1.0
- firehed/jwt: ^2.0
- firehed/security: ^1.0
Requires (Dev)
- firehed/arctools: 1.*
- phpunit/phpunit: ^5
README
Auth 是一个 PHP 项目的库,旨在简化多因素和高安全性身份验证的复杂性。数据存储在 JWTs 中,这些 JWTs 具有防篡改特性,允许将身份验证信息完全存储在客户端,无需数据库1。
通过实现单一接口,您的现有 PHP 应用可以灵活支持 MFA,而无需绑定到特定提供商或实现。由于基于开放标准,身份验证数据可以与任何框架一起使用,甚至可以移植到其他编程语言。
简单示例
<?php use Firehed\Auth; use Firehed\JWT; use Firehed\Security\Secret; // General setup $keys = new JWT\KeyContainer(); $keys->addKey('20130101', JWT\Algorithm::HMAC_SHA_256(), new Secret('some randomly-generated secret')); $auth = new Auth\Auth(); $auth->setKeys($keys) ->setLoader(function($uid): Auth\Authable { return (new User())->find($uid); }); // Authenticating a user $user = User::findByEmail($_POST['email']); $password = new Auth\Factors\KnowledgeFactor(new Secret($_POST['password')); $auth->setUser($user); try { $auth->validateFactor($password); setcookie('auth_token', $auth->getEncodedToken(), time()+(86400*90), '/', 'yourdomain.com', true, true); } catch (Auth\Exceptions\AuthException $e) { // password was incorrect } // Accessing a previously-authenticated user try { $user = $auth->setEncodedToken($_COOKIE['auth_token']) ->setRequiredLevel(Auth\Level::LOGIN()) ->getUser(); } catch (Auth\Exceptions\AuthException $e) { // Authentication failed, prompt for login header('Location: /login'); }
安装
通过 Composer 支持安装
composer require firehed/auth
有关更多信息,请访问 Composer 网站
API
setEncodedToken(string $token): self
从编码的 JWT 恢复身份验证会话。此方法通常用于登录页面。
setUser(Firehed\Auth\Authable $user): self
为新的用户启动身份验证会话。此方法通常用于登录流程的开始。
setLoader(callable $loader): self
提供一个回调,该回调将返回一个 Firehed\Auth\Authable 对象,前提是提供一个唯一标识符。这将与 setEncodedToken
一起使用,以便在恢复会话时使 getUser
能够工作。
它必须具有以下签名
function($uid): Firehed\Auth\Authable
setRequiredLevel(Firehed\Auth\Level $level): self
为 getUser
返回用户所需提供身份验证级别。默认为 Level::LOGIN
。
getEncodedToken(): string
获取包含当前用户身份验证数据的 JWT。这不包括敏感数据,并且由于签名而具有防篡改特性。您应该将编码的令牌存储在客户端,只要传输是安全的(这适用于任何会话标识符)。请注意,这包括用户的 ID。
getUser(): Firehed\Auth\Authable
获取已验证的用户。如果用户身份验证不足,这将抛出异常,防止意外访问。
enterHighSecurity(Firehed\Auth\Factors\Factor $factor): self
使用提供的因素启动高安全性会话。它将持续到因素上的过期时间。如果没有设置过期时间,它将只持续到请求结束。
exitHighSecurity(): void
无论剩余时间如何,退出高安全性模式。
validateFactor(Firehed\Auth\Factors\Factor $factor): self
使用提供的因素对用户进行身份验证。
expireFactor(Firehed\Auth\Factors\FactorType $type): self
删除由指定因素类型提供的身份验证数据。这通常用于注销用户。
setKeys(Firehed\JWT\KeyContainer $keys): self
提供用于内部 JWT 处理的 KeyContainer。这允许无缝且几乎自动地进行密钥轮换。
核心概念
- 身份验证:验证身份的行为
- 因素:一种身份验证方法。有三种不同的因素
- 内在性:用户 是 的某种东西,例如指纹
- 知识:用户 知道 的某种东西,例如密码短语
- 拥有:用户 拥有 的某种东西,例如 OTP 令牌
- 高安全模式:从概念上类似于
sudo
,这是一种通过要求进行新鲜认证来保护特别敏感操作(密码更改、信用卡管理等)的方法。 - 级别:页面可以要求四个认证级别
ANONYMOUS
:用户根本未进行认证,也不会通过getUser
返回。PARTIAL
:允许在部分认证用户上调用验证方法,尽管getUser()
将返回 null。这不应该在认证升级流程之外使用;例如,提供他们的OTP代码或令牌。使用getPartiallyAuthenticatedUser()
来获取底层用户,这应该仅用于修改用户的新因素注册(例如,提供的TOTP代码不匹配)。LOGIN
:用户需要其所有因素都存在。HISEC
:除了所有因素都存在之外,还必须通过enterHighSecurity
API 明确重新验证。
示例
(即将推出新示例)