隨著行動、雲端運算、物聯網等技術的快速發展,API成為了各種應用和系統之間資料互動的重要方式。在Web開發領域,PHP作為一種流行的後端語言,其提供了許多便於實作API的函式庫和框架。本文將介紹如何使用PHP建構API伺服器,分享從設計到實現的整個過程。
一、需求分析與設計想法
在實作API伺服器前,我們需要先明確需求與設計思路。本文實作的是一個簡單的API伺服器,其需求可以概括為:
為了實現以上需求,我們可以考慮如下的設計想法:
二、建置開發環境
在建置API伺服器前,我們要準備好PHP、MySQL等必要的開發環境。可以選擇使用整合開發環境(IDE)如PHPStorm、Eclipse等,也可以使用輕量級的編輯器如Visual Studio Code、Sublime Text等。本文以PHPStorm為例。
php -r "readfile('https://getcomposer.org/installer');" | php
安裝完成後,將composer.phar移至全域可用的路徑,例如/usr/bin/composer。
三、建立API伺服器
有了上述開發環境,我們可以開始建立API伺服器。
composer require slim/slim
或
composer require illuminate/routing illuminate/http
注意:如果選擇使用Lumen框架,則需要在bootstrap/app.php檔案中開啟$app->withFacades()和$app->withEloquent()開關,以便使用Lumen提供的Facade和Eloquent ORM功能。
$app->get('/hello/{name}', function ($request, $response, $args) { $name = $args['name']; $response->getBody()->write("Hello, $name"); return $response; }); $app->get('/users', 'UsersController:index'); $app->post('/users', 'UsersController:create');
這裡定義了3個路由:
$app->add(new JwtAuthMiddleware());
這裡定義了一個JwtAuthMiddleware中間件,用於驗證OAuth2授權的token和權限。
namespace App\Controllers; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use App\Models\User; class UsersController { public function index(Request $request, Response $response) { $users = User::all(); $response = $response->withJson($users); return $response; } public function create(Request $request, Response $response) { $data = $request->getParsedBody(); $user = new User; $user->name = $data['name']; $user->email = $data['email']; $user->password = password_hash($data['password'], PASSWORD_DEFAULT); $user->save(); $response = $response->withJson($user); return $response; } }
這裡定義了一個UsersController控制器,包含index和create方法,分別對應/users GET和/users POST請求。使用Eloquent ORM操作使用者資料表(User::all()和$user->save()),傳回JSON格式的回應。
php -S localhost:8000 -t public
這裡啟動了一個PHP的內建Web伺服器,監聽8000連接埠。在瀏覽器中造訪http://localhost:8000/hello/world,正常情況下應該回傳"Hello, world"字串。造訪http://localhost:8000/users時,應該會傳回所有使用者的JSON格式資料。
四、OAuth2授權
預設情況下,API伺服器是不安全的,因為任何人都可以存取介面並修改資料。為了保護API,我們可以使用OAuth2授權。 OAuth2是一個標準的授權協議,可以在不洩露使用者名稱和密碼的情況下,授權第三方應用程式存取特定使用者在某個資源伺服器上的受保護資源。在本文中,我們使用Firebase的JWT框架來實現OAuth2授權。
composer require firebase/php-jwt
namespace App; use Firebase\JWT\JWT; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use App\Models\User; class AuthorizationServer { private static $key = 'your_secret_key'; public static function getToken(Request $request, Response $response) { $data = $request->getParsedBody(); $user = User::where('email', $data['email'])->first(); if (!$user || !password_verify($data['password'], $user->password)) { return $response->withStatus(401)->withJson([ 'error' => 'Invalid email or password.' ]); } $now = time(); $payload = array( 'iat' => $now, 'exp' => $now + 3600, 'sub' => $user->id ); $jwt = JWT::encode($payload, self::$key); return $response->withJson([ 'access_token' => $jwt, 'token_type' => 'Bearer', 'expires_in' => 3600 ]); } public static function authenticate(Request $request) { $jwt = isset($request->getHeader('Authorization')[0]) ? explode(' ', $request->getHeader('Authorization')[0])[1] : null; if (!$jwt) { throw new Exception('Unauthorized.'); } try { $decoded = JWT::decode($jwt, self::$key, array('HS256')); $user = User::find($decoded->sub); if (!$user) { throw new Exception('Unauthorized.'); } return $user; } catch (Exception $e) { throw new Exception('Unauthorized.'); } } }
這裡定義了一個AuthorizationServer授權伺服器,包含兩個方法:
这里使用了JWT加密框架,将用户信息存储在token中,并使用HS256算法加密。
namespace App\Middlewares; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use App\AuthorizationServer; class JwtAuthMiddleware { public function __invoke(Request $request, Response $response, $next) { try { $user = AuthorizationServer::authenticate($request); $request = $request->withAttribute('user', $user); return $next($request, $response); } catch (Exception $e) { return $response->withStatus(401)->withJson([ 'error' => $e->getMessage() ]); } } }
这里定义了一个JwtAuthMiddleware中间件,用户验证客户端请求的access token的有效性,并在后面的控制器中通过$request->getAttribute('user')获取到用户对象。
$app->post('/auth/token', 'AuthorizationServer:getToken'); $app->group('', function () use ($app) { $app->get('/users/@id', 'UsersController:getUser'); $app->put('/users/@id', 'UsersController:updateUser'); $app->delete('/users/@id', 'UsersController:deleteUser'); })->add(new JwtAuthMiddleware());
这里定义了一个/auth/token路由,用于获取访问令牌。另外,对于需要OAuth2授权的路由(getUser、updateUser和deleteUser),使用$app->group()方法包裹其中,并添加JwtAuthMiddleware中间件。
五、总结
本文介绍了如何使用PHP搭建API服务器,基于Slim或Lumen框架,解析URL参数、返回JSON格式的数据,并使用OAuth2框架保护API的安全性。使用这种方式搭建API服务器,可以快速、高效地开发出各种类型的RESTful API。但是,具体实现还需要根据实际需求进行适当调整和优化。
以上是如何使用PHP建立API伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!