我正在用CodeIgniter 4构建一个web应用程序,在那里我实现了一个用于注册和登录的REST API和一个配置文件页面,只是为了测试我的登录。
我有一个登录表单,它发送一个javascript获取post请求到我的api,我收到一个jwt令牌。
现在的情况是,我认为我没有理解这个原理。我希望用户保持登录,不需要每次重新登录。令牌将在12小时后过期
我想使用php(如果可能的话)作为整个应用程序在php上运行。
目前,我有一个小javascript函数来存储我的令牌:
const store = {};
store.setJWT = (data) => {
this.JWT = data;
};
但是这对于页面重新加载是不安全的。
另外,我正在创建一个cookie与php,当用户登录:
helper('cookie');
set_cookie([
'name' => 'login',
'value' => $token,
'expire' => $exp,
'httponly' => true,
'secure' => true,
]);
我可以使用cookie或store
对象从API获取数据。
const token = getCookie('login');
const res = await fetch('/profile', {
headers: {
'Authorization': `Bearer ${token}` // or store.JWT
}
});
所以…我想要的是:用户进入一个受保护的url,例如https://myapp.com/profile
,如果他登录了,他就有访问权限。否则,他将被重定向到登录页面。
使用cookie存储jwt是一个好主意吗?还是我完全误解了JWT的概念,它不被用于登录?
另外:我仍然不知道将登录构建为API是否是最好的主意。
首先,构建"使用api登录"并没有错。这是常见的做法。JWT非常适合于auth。
你当然可以在cookie中存储JWT令牌,但在我看来这有点错。通常,JWT令牌存储在客户端的本地存储中。在页面重新加载后,它将持续存在。
在本地存储中设置令牌:
localStorage.setItem('token', token);
从本地存储获取令牌:
token = localStorage.getItem('token');
为了更好地理解JWT的概念,您可以复制一些令牌(不含Bearer)并将其粘贴到JWT .io中。基本上JWT包含关于用户的所有必需信息,服务器可以信任这些信息。
当你像这样设置cookie
set_cookie([
'name' => 'login',
'value' => $token,
'expire' => $exp,
'httponly' => true,
'secure' => true,
]);
这太过分了。JWT可能已经包含了所有这些信息,您可以从令牌中提取这些信息。