1. 什么是RESTful API?
RESTful API 是使用 HTTP 协议定义了对于资源的一个操作集合。每个资源可以使用 HTTP 动词(GET、POST、PUT 和 DELETE)来执行适当的操作。
RESTful 的优势在于它使 Web 应用程序的开发和维护更加简单明了。而且,RESTful 还可以使 Web 应用程序的性能得到提高,并且符合大多数互联网的应用程序开发标准。
2. 如何实现RESTful API的身份验证?
在 RESTful API 应用程序中,身份验证是非常重要的。身份验证可以确保不被授权的用户无法访问您的资源。
2.1. 使用OAuth2.0进行身份验证
OAuth2.0是一个开放标准的协议,它允许用户授权第三方应用程序访问自己的资源,而不必将自己的用户名和密码传递给第三方应用程序。OAuth2.0协议之所以如此流行,是因为它具备简单、安全、可扩展等特点。
让我们来看看如何在 PHP 中使用 OAuth2.0 进行身份验证
// Composer 安装
composer require league/oauth2-server
// OAuth 服务器,请求和响应等
$server = new \League\OAuth2\Server\AuthorizationServer();
$grantType = new \League\OAuth2\Server\Grant\PasswordGrant(
// Identity provider (must implement UserRepositeryInterface)
$userRepository,
// Refresh token repository (must implement RefreshTokenRepositoryInterface)
$refreshTokenRepository
);
// 设置 refresh token 的 TTL,默认为 1 个月
$grantType->setRefreshTokenTTL(new \DateInterval('P1M'));
// 从身份验证服务器注册授权类型
$server->enableGrantType(
$grantType,
new \DateInterval('PT1H') // access tokens 有效期 1 小时
);
上面的代码演示了如何使用 League\OAuth2\Server 库设置身份验证授权类型和访问令牌过期时间。
2.2. 基于 token 的身份验证
另一种常见的 RESTful API 身份验证方式是基于token的身份验证。 这种方式相对来说比 OAuth2.0 要简单一些。在这种情况下, RESTful API 应用程序会向用户提供一个 token,用户在访问 RESTful API 的时候需要提供这个 token,从而来进行身份验证。
下面是一个示例代码,用于生成、验证和存储密钥:
// 生成随机 Token
$token = hash('sha256', 'my-secret-key' . rand(1000, 9999));
// 存储 Token
// 在存储时,您要验证此 Token 是否已存在,
// 如果 Token 已经存在,则不再进行保存
if (!$exists) {
$expiresAt = time() + (24 * 60 * 60); // 1 天后过期
saveToken($token, $userId, $expiresAt);
}
// 在资源请求时进行身份验证
$token = getBearerToken();
if (!$token) {
throw new Exception('Unauthorized Access', 401);
}
// 验证 Token 是否有效
$isTokenValid = validateToken($token);
if (!$isTokenValid) {
throw new Exception('Unauthorized Access', 401);
}
上面的代码演示了如何使用 PHP 生成一个 token,并且对 token 进行身份验证和存储。
2.3. 基于 HTTP Basic 认证的身份验证
HTTP Basic 身份验证是一种简单的身份验证机制,它需要指定用户名和密码。在 RESTful API 中,可以使用 HTTP Basic 身份验证来进行身份验证操作。这种方式使用 PHP 内置函数实现,比较简单。下面是一个示例代码:
// 执行 HTTP Basic 认证
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Not authorized';
exit;
} else {
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
// 认证用户名和密码
$isValidUser = validateUser($username, $password);
if (!$isValidUser) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Not authorized';
exit;
}
}
上面的代码演示了如何使用 PHP 内置的 HTTP Basic 认证。
3. 小结
RESTful API 的身份验证可以确保只有授权的用户能够访问您的资源和数据。在本文中,我们演示了几种不同的 RESTful API 身份验证机制:OAuth2.0、基于 token 的身份验证和基于 HTTP Basic 认证的身份验证。这些身份验证机制都是非常流行的,每种身份验证机制都有自己的特点和局限性,需要根据具体情况进行选择。