unvurn/reauth

Reauth - Laravel 的另一个身份验证模块

0.1.0 2024-07-31 04:07 UTC

This package is auto-updated.

Last update: 2024-08-31 04:24:33 UTC


README

此包为基于 Laravel 的 API 服务器提供基于令牌的身份验证能力。

安装

$ composer require unvurn/reauth

并将生成迁移文件。

$ php artisan vendor:publish --tag=reauth-migrations

配置

守卫

# config/auth.php
return [
    'guard' => 'bearer',

    'guards' => [
        # this 'bearer' entry is implied within reauth package itself.
        # you don't have to duplicate it.
        'bearer' => [
            'driver' => 'bearer',
            'pipelines' => [
                [
                    'resolver' => OpaqueAccessTokenResolver::class,
                    'users' => AccessTokenUserProvider::class
                ]
            ]
        ],
        'json' => [
            'driver' => 'json',
            'pipelines' => [
                'custom_id' => [
                    'resolver' => function ($value, &$decoded) {
                        $decoded = $value;
                        return [ 'custom_id' => $value ];
                    },
                    // 'users': can be omitted
                ]
            ],        
        ]
    ]
];

Reauth 包提供了一种新的 Guard 形式。守卫有两个属性 - 'driver' 和 'pipelines'。

'Driver' 属性为每个 HTTP 请求分配令牌来源。'Bearer' 驱动要求每个 HTTP 请求的 "Authorization" 标头中携带令牌。这意味着每个请求应包含类似这样的头信息:

Authorization: Bearer (token string)

'Json' 驱动要求 JSON 请求体包含指定的属性,例如上面示例中的 "custom_id"。

管道

守卫有一个或多个管道,用于将身份验证结果从令牌传递到后续过程(例如 Controller)。每个管道按顺序处理,当找到认证用户时结束(后续管道被丢弃)。

解析器

解析器的作用是解码原始令牌字符串(如果它是 "不透明" 令牌则直接传递),并将其安排为 UserProvider::retrieveByCredentials() 的 "credentials"。

有两种方式配置解析器的工作方式。第一种是使用实现 TokenResolverInterface 的类实例,如下所示。

            'pipelines' => [
                [
                    'resolver' => OpaqueAccessTokenResolver::class,
                    // ...
                ]
            ]

此类 OpaqueAccessTokenResolver 实现 TokenResolverInterfacecredentialsFromToken 方法。

另一种是匿名函数,如下所示

            'pipelines' => [
                [
                    'resolver' => function ($value, &$decoded) {
                        $decoded = $value;
                        return [ 'custom_id' => $value ];
                    },
                ]
            ]

此匿名函数的签名与 TokenResolverInterface::credentialsFromToken() 类似。

警告

如果您不关心后续过程(例如 Controller)中的解码令牌,可以省略并忽略第二个参数,如下所示,尽管这不被推荐。

                  'resolver' => function ($value) {
                      return [ 'custom_id' => $value ];
                  },

尽管如此,这并不推荐。

解析器适用于以下过程

  • 如果输入令牌具有特定的编码、加密、格式等,解析器可以将原始令牌字符串分解成适当的结构。
  • (如有必要) 检查令牌是否存在 - 过期限制、令牌所有者、源地址等。
  • 将令牌信息安排为 "credentials" - 供 UserProvider 使用。

用户(= UserProvider)

用户(UserProvider)的作用是查找与先前过程中推导出的凭证匹配的用户。与 Laravel Auth 中定义的普通 UserProvider 相似。"Reauth" 包通过使用用户相关模型类提供额外的功能。

  • AccessTokenUserProvider
  • AttributionalUserProvider
  • OpenIdUserProvider