firehed/auth

身份验证工具集

0.2.2 2016-03-12 21:24 UTC

This package is auto-updated.

Last update: 2024-08-29 04:03:32 UTC


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 明确重新验证。

示例

(即将推出新示例)