jupix / laravel-oauth2-server
Laravel 4 OAuth2 Server
This package is not auto-updated.
Last update: 2024-09-24 07:57:42 UTC
README
A drop-in oauth2 (draft 31) authentication provider for the Laravel framework.
目的
提供一个即插即用、易于使用的Laravel化OAuth2提供者(=服务器)。当前的替代品只是简单地复制了https://oauth.ac.cn/2/上的代码示例,并没有充分利用Laravel的巨大潜力。此外,它们只做到了草案10。
因此,重新编写、精简和组织一些代码,紧密遵循IETF RFC OAuth2的草案31,并将端点封装在一系列路由和过滤器((:bundle)/token和(:bundle)/authorize)中,似乎是合理的。草案中的许多功能都得到了支持,如下所示
- 授权类型
-
authorization_code
-
username
(与client_id client_secret对相比) -
refresh_token
-
assertion
(目前SAML2.0格式尚不明确,并且没有主要的oAuth供应商似乎提供它)
-
- 响应类型
-
token
-
code
-
code-and-token
(看不出其意义+在草案31的第11.3节中未定义。如果有足够的请求,将会实现它)
-
- 作用域
- Scope restriction client->token(客户端的作用域分配定义了它可以为令牌请求的最大作用域)
- 客户端
- 客户端认证链接(部分。定义您的客户端具有用户_id,与您希望关联的认证ID,并修改过滤器。我将提供一个示例)
总的来说,功能非常丰富,但仍可扩展。
使用方法
安装
使用artisan(php artisan bundle:install oauth2-sp
)或手动将此存储库的内容复制到bundles/
中安装它。此捆绑包需要表,并提供了迁移。运行php artisan migrate oauth2-sp
以创建表 - 将创建以下表:oa_clients
、oa_tokens
、oa_scopes
,以及client->scope、token->scope关联表。
加载捆绑包
将以下内容添加到您的bundles.php文件中:"oauth2-sp" => array("auto" => true, "handles" => "oa"),
auto
将自动在每个请求上启动捆绑包,使您能够访问在start.php
中定义的过滤器以及其中的自动加载定义。handles
将允许您定义捆绑包子目录映射(在我的情况下/oa/)以用于您的端点配置。其中将包含token和authorized端点。
完成此操作后,您就完成了!
添加客户端
添加客户端通过Laravel模型完成,以便于使用。如下所示
$client = new SebRenauld\OAuth2\Models\Client(); $client->redirect = "http://my.redirect.domain/"; $client->token = SebRenauld\OAuth2\Models\Token::generateEntropy(); $client->secret = SebRenauld\OAuth2\Models\Token::generateEntropy(); // $client->user_id = Auth::user()->id; $client->save();
按出现顺序
redirect
提供客户端的根重定向URL。如果需要,可以在不创建新客户端的情况下为子域请求令牌。token
和secret
提供您的client_id和client_secret参数user_id
如果您想轻松地与您的认证数据库建立关系映射,将提供一个额外的字段
保存它将创建客户端。
创建作用域
创建作用域也是模型的问题。如下所示
$scope = new SebRenauld\OAuth2\Models\Scope(); $scope->name = "my_scope"; $scope->save();
name
显然是您的范围名称。
将作用域绑定到客户端
将可能的作用域添加到客户端(超出自动创建配置选项)也非常简单。找到客户端和作用域(这里假设为 $client
和 $scope
),然后将一个附加到另一个即可
$client->scopes()->attach($scope->id);
这同样适用于令牌!
从客户端删除作用域也遵循Laravel Eloquent模型系统。然而,请注意,这不会从分配给客户端的令牌中删除作用域,只会删除未来创建的内容(以保持一致性)。
使用提供者
OAuth提供者没有示例会是什么样子?请求令牌相当简单。创建一个带有令牌、密钥和重定向URI的客户端。如果您想自动化这个过程,请使用Google的OAuth沙盒( https://developers.google.com/oauthplayground/ - 在 http://www.youtube.com/watch?v=xzmEC_a-S9M 可以看到这种方法)。
三脚OAuth2
步骤1:请求授权令牌
请求: /authorize?response_type=code&client_id=[YOUR ID]&redirect_uri=[YOUR REDIRECT URI]&scope=[YOUR SCOPE]
返回
- 成功时,重定向到您的重定向URI,URI中包含一个
code
- 失败时,重定向到您的重定向URI,URI中包含错误代码。如果URI不匹配,则以JSON形式打印
步骤2:用令牌交换访问令牌
请求: /token?client_id=[YOUR ID]&client_secret=[YOUR SECRET]&grant_type=authorization_code&scope=[YOUR SCOPE]&code=[YOUR CODE]&redirect_uri=[YOUR REDIRECT URI]
返回
- 成功时,返回一个包含令牌类型、访问令牌、过期信息和刷新令牌的JSON对象
- 失败时,返回一个包含错误的JSON对象
步骤3(可选):刷新令牌
请求: /token?client_id=[YOUR ID]&client_secret=[YOUR SECRET]&grant_type=refresh_token&scope=[YOUR SCOPE]&refresh_token=[YOUR REFRESH CODE]&redirect_uri=[YOUR REDIRECT URI]
返回
- 与上面相同
Laravel过滤器:oauth2
此库的过滤器称为 oauth2
。如果用户没有提供令牌,它将默认为 Response::error(403)。
您可以在 start.php
中轻松修改它或创建自己的。请注意,verify($tokenStr)
返回客户端而不是令牌,用于身份验证目的。
扩展此库
您可以通过监听事件轻松为步骤1定义更多响应类型。此库将触发事件 oauth2.generate: [TYPE]
并等待第一个令牌/响应返回。如果已获取令牌,则使用 oauth2.redirect: [TYPE]
进行重定向。
事件列表更详尽
oauth2.error.redirect
处理发生错误时的重定向oauth2.error.json
处理JSON输出错误
这些允许您轻松修改库的返回格式。