假设您要构建一个 APP。
- ReactJS
- 带有 PHP 的 REST API
- 使用JWT
1。简介
在构建 REST API 时,您必须忘记会话。
REST API 是无状态的,因此它们不能依赖会话,它们必须仅使用客户端提供的数据来处理请求。
2。身份验证
客户想做的只是用一些username和password换取一个令牌。
这是一个 HTTP 请求示例
POST /api/v1/authentication HTTP/1.1
Host: localhost
Content-Type: application/json
{
"username": "foo",
"password": "bar"
}
响应是:
{
"token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
3。让我们更详细地了解请求/响应
我们的 API 将如何处理身份验证请求?
它将检查用户名foo和密码bar的用户是否已创建并且在DB中处于活动状态
会生成一个JWT(Json Web Token)
它将返回包含 JWT 的响应
这是一些超级简单的认证方法,只是举例。
public function authAction()
{
/** Get your payload somehow */
$request = $_POST;
//Validate if username & password are given/
$user = $this->model->auth($username, $password);
if(!$user) {
//throw error for not valid credentials
}
$jwt = $this->jwt->create($user);
//return response with $jwt
}
如您所见,它们没有设置会话或任何东西。
我们的客户端将如何处理响应?
客户端可以使用像superagent这样的包来处理对我们API的请求和响应,这样流程将被简化为:
let data = {
username: email,
password: password
};
request
.post('/api/v1/authentication')
.set('Content-Type', 'application/json')
.send(data)
.end(function (error, response) {
//response.body.token
});
4。在服务器端创建 JWT
您可以使用一些 3RD PT 包来生成和验证 JWT,而不是自己编写。
看看这个package,你就知道它是怎么做到的了。
并记住始终创建强大的签名。
我推荐使用RSA keys
我不是在宣传或支持这个项目,只是觉得在这里分享它很有用。我从未使用过它,我在我的 NodeJS 项目中使用了类似的东西。
5。在客户端保存 JWT
您已经知道它们是两种方式localStorage 和cookies
对我来说,我使用 cookie,因为:
- 他们有点多secure。
- 无需实现一些自定义逻辑即可设置过期日期。
- 旧版浏览器支持(非常旧的浏览器,所以没那么重要)。
但这一切都取决于你。
6。使用 JWT
从现在开始,对服务器的每个请求都必须包含您的 JWT。
在您的 REST API 中,您必须编写一个方法来验证 JWT 并将其交换为用户对象。
示例请求:
let jwt = ...; //GET IT FROM LOCALSTORAGE OR COOKIE
request
.get('/api/v1/posts')
.set('Content-Type', 'application/json')
.set('Authorization', jwt)
.end(function (error, response) {
});
API 将如何处理此请求
public function postsAction()
{
$jwt = $this->headers->get('Authorization');
if(!$this->jwt->validate($jwt)) {
//throw unauthorized error
}
$user = $this->model->exchangeJWT($jwt);
//Your logic here
}
7。过期日期和 cookie
如果您使用 cookie 来保存您的 JWT,请谨慎设置过期日期。
cookie 过期日期必须等于 JWT 过期日期。