bemit / auth-middleware
用于多项目认证和Auth0认证的自定义PSR中间件。
0.1.3
2021-12-18 11:13 UTC
Requires
- php: >=8.1
- auth0/auth0-php: ^8.0.0
- psr/http-client: *
- psr/http-factory: *
- psr/http-message: *
- psr/http-server-handler: *
- psr/http-server-middleware: *
- psr/log: *
Suggests
- psr/cache: For caching issuer JWKs
README
一些自定义认证中间件,支持多租户(租户即为项目)和针对多个“提供的服务”进行用户识别和授权。使用/a/和Auth0以及一些(未公开)的自定义身份提供者构建。
需要psr/http-client
、psr/http-factory
和psr/log
实现。
适用于无状态的PHP API,不适用于PHP会话认证。使用一个Auth0单页应用程序生成/验证访问令牌,以及一个可选的Auth0服务器应用程序,用于通过Auth0管理API进行认证。
composer require bemit/auth-middleware
Bemit\AuthMiddleware\Auth0Service
提供Auth0管理API客户端,如果不使用,则无需配置。
- 构造函数检查示例依赖定义
management(): 管理
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
可选指定自定义受众IDAUTHORIZATION
以Bearer THE_TOKEN_A1234
格式提供访问令牌
在认证时添加属性
auth_token_data
作为Bemit\AuthMiddleware\TokenData
auth_user_data
作为Bemit\AuthMiddleware\UserData
auth_project
作为Bemit\AuthMiddleware\ProjectData
auth_id
作为string
,带有sub
(用户ID)
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许可证下发布代码。