jupix/laravel-oauth2-server

Laravel 4 OAuth2 Server

dev-master 2014-10-10 14:50 UTC

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_clientsoa_tokensoa_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。如果需要,可以在不创建新客户端的情况下为子域请求令牌。
  • tokensecret提供您的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输出错误

这些允许您轻松修改库的返回格式。