如何在Slim PHP中授予客户端凭据OAuth 2.0

7ajki6be  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(133)

我是新来的,正试图使用slim PHP学习API,最近我被介绍给Postman,发现你可以在代码之前测试API,这很有趣,然后我深入研究,发现了Oauth 2.0,现在问题出在Postman上。我可以轻松获得不记名令牌,并探索一些API

但是我找不到任何资源告诉我如何在我的瘦PHP文件中实现它。顺便说一下,我正在测试的项目是文本。我以前不知道Postman,但是这个API文档介绍了它,然后我在YouTube上尝试了一些教程,我得到了授权,但是那是在Postman中,所以我如何在slim-php上实现?
我是无能的,因为我没有看到任何样本,所以我不能写任何代码的基础上。OAuth 2.0是一个新的版本。

6uxekuva

6uxekuva1#

OAuth 2.0是一个允许第三方应用程序获得对HTTP服务的有限访问的协议。客户端凭据授权是一个简化的流程,适用于客户端是资源所有者的机器对机器身份验证。
要在Slim PHP中实现OAuth 2.0 Client Credentials Grant,请执行以下步骤:
运行时间:

composer require bshaffer/oauth2-server-php

创建表

使用以下架构创建默认数据库:
https://bshaffer.github.io/oauth2-server-php-docs/cookbook/
运行以下SQL来创建一个OAuth客户端:

INSERT INTO oauth_clients (client_id, client_secret, redirect_uri) VALUES ("testclient", "testpass", "http://fake/");

设置OAuth 2.0服务器

配置OAuth PDO连接:

use OAuth2\Storage\Pdo;
use OAuth2\Server;
use OAuth2\GrantType\ClientCredentials;
// ...

// Set up your database connection
$dsn = 'mysql:dbname=test;host=localhost';
$username = 'root';
$password = '';
$storage = new Pdo(['dsn' => $dsn, 'username' => $username, 'password' => $password]);

// Pass a storage object to the OAuth2 server class
$oauth = new Server($storage);

// Add the Client Credentials grant type (it is the simplest of the grant types)
$oauth->addGrantType(new ClientCredentials($storage));

添加端点:

客户端将从此端点请求访问令牌。

$app->post('/token', function (ServerRequestInterface $request, ResponseInterface $response) use ($oauth) {
    // Map PSR-7 request to OAuth2 Request
    $oAuthRequest = new OAuth2\Request(
        $request->getQueryParams(),
        (array)$request->getParsedBody(),
        [],
        $request->getCookieParams(),
        $request->getUploadedFiles(),
        $request->getServerParams()
    );

    // Map OAuth2 response to PSR-7 response
    $oauthResponse = $oauth->handleTokenRequest($oAuthRequest);
    $response = $response->withStatus($oauthResponse->getStatusCode());
    foreach ($oauthResponse->getHttpHeaders() as $header => $value) {
        $response = $response->withHeader($header, $value);
    }

    $params = $oauthResponse->getParameters();
    $response->getBody()->write(json_encode($params));

    return $response;
});

这是一个受保护的资源,需要访问令牌才能访问。

$app->get('/resource', function (ServerRequestInterface $request, ResponseInterface $response) use ($oauth) {
    // Map PSR-7 request to OAuth2 Request
    // ...

    if (!$oauth->verifyResourceRequest($oAuthRequest)) {
        // Map OAuth2 response to PSR-7 response
        // ...

        return $response;
    }

    // The access token is valid, return the protected resource
    $response->getBody()->write(json_encode(['success' => true, 'message' => 'You accessed my APIs!']));
    return $response->withHeader('Content-Type', 'application/json');
});

发送POST请求(使用Postman)以生成令牌:
POST http://localhost/token

{
  "grant_type": "client_credentials",
  "client_id": "testclient",
  "client_secret": "testpass"
}

结果:

{
  "access_token": "674f15fe84a6ee96420b7bd34df6bb5c16ee5103",
  "expires_in": 3600,
  "token_type": "Bearer",
  "scope": null
}

向受保护的端点发送GET请求,并使用Authorization标头:

GET http://localhost/resource

Authorization: Bearer 674f15fe84a6ee96420b7bd34df6bb5c16ee5103

回应:

{
  "success": true,
  "message": "You accessed my APIs!"
}

相关问题