delboy1978uk/bone-oauth2

Bone框架的OAuth2功能

v1.8.6 2024-09-06 22:29 UTC

README

Latest Stable Version Total Downloads License
Bone MVC框架的OAuth2授权和资源服务器功能

安装

从Bone框架项目的根目录使用composer进行安装

composer require delboy1978uk/bone-oauth2

配置

只需将包添加到Bone的包配置中

<?php

// use statements here
use Bone\OAuth2\BoneOAuth2Package;
use Bone\User\BoneUserPackage;

return [
    'packages' => [
        // packages here (order is important)...,
        BoneUserPackage::class,
        BoneOAuth2Package::class,
    ],
    // ...
];

生成公钥和私钥

首先进入data/keys目录。

cd data/keys

使用openssl生成私钥,然后从私钥中提取公钥

openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key
chmod 660 public.key
chmod 660 private.key

如果您想为私钥提供密码,则运行以下命令

openssl genrsa -passout pass:_passphrase_ -out private.key 2048
openssl rsa -in private.key -passin pass:_passphrase_ -pubout -out public.key
chmod 660 public.key
chmod 660 private.key

如果已使用密码生成私钥,则必须在授权服务器处提供该密码。

公钥应分发给任何需要验证访问令牌的服务(例如资源服务器)。

生成加密密钥

返回到项目根目录。

cd ../..

运行此命令并将它添加到您的配置中。

vendor/bin/generate-defuse-key

运行数据库迁移以生成表

vendor/bin/bone migrant:diff
vendor/bin/bone migrant:migrate
vendor/bin/bone migrant:generate-proxies

所需配置值

密钥可以存储在config数组之外,并作为环境变量获取以提高安全性,但这些是您需要的配置设置。

<?php

return [
    'oauth2' => [
        'clientCredentialsTokenTTL' => 'PT1H', // 1hour
        'authCodeTTL' => 'PT1M', // 1 minute
        'accessTokenTTL' => 'PT5M', // 5 minutes
        'refreshTokenTTL' => 'P1M', // 1 month
        'privateKeyPath' => '/path/to/private.key',
        'publicKeyPath' => '/path/to/private.key',
        'encryptionKey' => 'generatedKeyString',
    ],   
];

用法

服务器端

您可以使用vendor/bin/bone命令创建客户端。您还可以创建作用域,并将作用域授予客户端。

要将端点锁定以需要访问令牌,只需将ResourceServerMiddleware添加到Bone框架包类中的路由或路由组中即可

$router->map('GET', '/ping', [ExampleController::class, 'pingAction'])->middleware($c->get(ResourceServerMiddleware::class));

在您的控制器中,您将访问到用户,现在它是一个OAuthUser的实例。您还可以获取请求授予的作用域。

    /**
     * @param $request
     * @param array $args
     * @return ResponseInterface
     * @throws \Exception
     */
    public function someAction(ServerRequestInterface $request, array $args) : ResponseInterface
    {
        /** @var \Bone\OAuth2\Entity\OAuthUser $user */
        $user = $request->getAttribute('user');
        
        if (!in_array('email', $request->getAttribute('oauth_scopes'))) {
            throw new Exception('How dare you!', 403);
        }

        return new JsonResponse(['random' => 'data']);
    }

客户端

客户端使用RFC6749中描述的标准OAuth2流程进行连接,您的Bone应用中的两个端点是

  • /oauth2/authorize
  • /oauth2/token

站点用户

登录用户现在有一个额外的端点可以访问,即/user/api-keys,在那里他们可以获取新的API密钥或删除现有的密钥。

控制台

您还可以访问更多的bone命令选项

bone client:create
bone client:create
bone scope:create
bone scope:list