bemit/auth-middleware

用于多项目认证和Auth0认证的自定义PSR中间件。

0.1.3 2021-12-18 11:13 UTC

This package is auto-updated.

Last update: 2024-09-18 17:32:43 UTC


README

Latest Stable Version License

一些自定义认证中间件,支持多租户(租户即为项目)和针对多个“提供的服务”进行用户识别和授权。使用/a/和Auth0以及一些(未公开)的自定义身份提供者构建。

需要psr/http-clientpsr/http-factorypsr/log实现。

适用于无状态的PHP API,不适用于PHP会话认证。使用一个Auth0单页应用程序生成/验证访问令牌,以及一个可选的Auth0服务器应用程序,用于通过Auth0管理API进行认证。

composer require bemit/auth-middleware

Bemit\AuthMiddleware\Auth0Service

提供Auth0管理API客户端,如果不使用,则无需配置。

Bemit\AuthMiddleware\AuthService

提供客户端访问令牌的验证器。

  • 构造函数检查示例依赖定义
  • validate(string $token, ?string $audience = null): ?ValidateResult 验证令牌
    • 令牌必须是纯文本的,例如不带 Bearer
    • 如果指定了 audience,则使用此受众验证令牌,它必须在 allowed_audiences
  • isAudienceAllowed(string $audience): bool

Bemit\AuthMiddleware\AuthMiddleware

一个PSR中间件,用于从头部提取访问令牌和可能受众,验证它并将验证结果添加到请求属性中。

如果受众不被允许,则返回包含原因的JSON响应的 401。当令牌无效时,没有特殊处理,请在请求处理程序内部进行检查并相应地抛出/响应。捕获 NotAuthorizedException 的抛出并使用 401 响应,其中包含 {error: string, reason: string},其中 reason 是可选的异常消息。

  • __construct(AuthService $auth, Psr\Http\Message\ResponseFactoryInterface $response, Psr\Http\Message\StreamFactoryInterface $stream)
  • process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface

使用头部

  • AUDIENCE 可选指定自定义受众ID
  • AUTHORIZATIONBearer THE_TOKEN_A1234 格式提供访问令牌

在认证时添加属性

Bemit\AuthMiddleware\RequestHandlerAuthorizeChecker

PSR请求处理程序的trait,用于轻松验证是否应授予访问权限,当某些授权检查失败时抛出 Bemit\AuthMiddleware\NotAuthorizedException

  • requireRole(ServerRequestInterface $request, string $service, string $role): void
    • 当服务未授予角色时失败
  • requireRoleOneOf(ServerRequestInterface $request, string $service, array $possible_roles): void
    • possible_roles 作为 string[],必须匹配指定的角色之一
  • requireProjectAccess(ServerRequestInterface $request, string $project_id): void
    • 不检查任何角色,只需指定的访问令牌对给定的 project 有效即可

Bemit\AuthMiddleware\RequestAuthorizeContext

获取服务器请求属性中输入数据的便捷函数。

  • static getTokenData(ServerRequestInterface $request): ?TokenData
  • static getUserData(ServerRequestInterface $request): ?UserData
  • static getProject(ServerRequestInterface $request): ?ProjectData
  • static getId(ServerRequestInterface $request): ?string

Bemit\AuthMiddleware\NotAuthorizedException

当需要授权但未拥有授权时的异常。

依赖项

依赖项定义示例,使用PHP\DI

<?php

use function DI\autowire;
use function DI\get;

$dependencies = [
    // the middleware uses `AuthService and psr/http-factory implementation for responses
    Bemit\AuthMiddleware\AuthMiddleware::class => autowire(),
    Bemit\AuthMiddleware\AuthService::class => autowire()
        ->constructorParameter('issuer', $_ENV['AUTH_CLIENT_ISSUER'])
        ->constructorParameter('audience', $_ENV['AUTH_CLIENT_AUDIENCE'])
        // use either frontend client id for e.g. APIs or otherwise same as for Auth0Service
        ->constructorParameter('client_id', $_ENV['AUTH0_CLIENT_ID_FRONTEND'])
        ->constructorParameter('namespace_user_data', 'https://userdata')
        ->constructorParameter('namespace_projects', 'https://id.namespace')
        ->constructorParameter('allowed_audiences', [
            $_ENV['AUTH_CLIENT_AUDIENCE'],
        ])
        // optional, for jwks caching:
        ->constructorParameter('cache', get(Psr\Cache\CacheItemPoolInterface::class))
        ->constructorParameter('cache_ttl', 360),
    Bemit\AuthMiddleware\Auth0Service::class => autowire()
        ->constructorParameter('issuer', $_ENV['AUTH_CLIENT_ISSUER'])
        ->constructorParameter('client_id', $_ENV['AUTH0_CLIENT_ID'])
        ->constructorParameter('client_secret', $_ENV['AUTH0_CLIENT_SECRET'])
        ->constructorParameter('http_client', get(Psr\Http\Client\ClientInterface::class))
        ->constructorParameter('logger', get(Psr\Log\LoggerInterface::class)),
];

许可证

本项目是免费软件,在MIT许可证下分发。

贡献者

通过将代码提交到代码库,您同意在代码库附带的MIT许可证下发布代码。

Michael Becker维护