首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于令牌的身份验证中的会话

基于令牌的身份验证中的会话
EN

Stack Overflow用户
提问于 2017-08-02 03:15:22
回答 3查看 11.9K关注 0票数 22

我正在用PHP Lumen构建一个应用程序,它在登录时返回一个令牌。我不确定如何超越这一点。

如何使用这些令牌来维护会话?

具体地说,如果我使用reactjs或普通的HTML/CSS/jQuery,我如何在客户端存储令牌,并在每次请求我的web应用程序的安全部分时发送它们?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-12 00:01:30

我通常做的是将令牌保存在本地存储中,这样即使用户离开网站,我也可以持久化令牌。

代码语言:javascript
复制
localStorage.setItem('app-token', theTokenFromServer);

每次用户加载页面时,我要做的第一件事就是检查令牌是否存在。

代码语言:javascript
复制
token = localStorage.getItem('app-token');

如果使用react,我会将令牌保留在全局状态(例如使用redux ):

代码语言:javascript
复制
function loadAppToken(token) {
  return {
    type: 'LOAD_TOKEN',
    payload: { token },
  };
}

使用vanilla javascript,我会将它保存在我的连接实用程序中。它可能看起来像下面这样:

代码语言:javascript
复制
const token = localStorage.getItem('app-token');

export function request(config) {
   const { url, ...others } = config;

   return fetch(url, {
     ...others,
     credentials: 'include',
     headers: {
       'Authorization': `Bearer ${token}`
     },
   });
}

我在react应用程序中仍然有一个fetch实用程序,类似于前面的代码,但我会在选项中发送令牌,为每个请求在redux中间件中获取它。

票数 12
EN

Stack Overflow用户

发布于 2017-08-11 12:18:51

您可以将其存储在浏览器的localStorage中,然后将其设置在每个对服务器的请求的头中。

票数 2
EN

Stack Overflow用户

发布于 2017-08-12 16:33:21

您实际上不需要任何ReactJS或VanillaJS。实际上就是纯HTML和PHP。我所做的就是将其存储为cookie。

首先,当您从Lumen收到令牌时,将其保存在特定用户的用户数据库中。然后使用下面的代码将用户id和accesstoken设置为在特定时间后过期的cookie:

代码语言:javascript
复制
setcookie('userid',$userid, time()+(3600 * 24 * 15),"/");
setcookie('accesstoken',$accesstoken, time()+(3600 * 24 * 15),"/");
header('Location: /home.php');
//You can change the 15 in setcookie() to amount of days the cookie will expire in.
//The "/" in setcookie is important, because it ensures the cookies will be available on every page the user visits on your website.
//The header function redirects to your home page after log in

下面是你的主页的样子。它检查accesstoken cookie是否存在,如果存在,则再次检查令牌是否与用户数据库中的当前令牌匹配。如果匹配,则会显示“已登录”页面。如果没有,您应该显示/重定向到登录页面。

代码语言:javascript
复制
<?php
if (isset($_COOKIE['accesstoken']))
{
//connect to your user database and check that the cookie accesstoken matches
// if it doesn't match, deal with it appropriately, such as deleting all cookies then redirecting to login page.
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Sup</title>
</head>
<body>
<?php if (isset($_COOKIE['accesstoken'])){ ?>

<h1>User logged in!</h1>
<h3>Do whatever you need to do if user is logged in</h3>

<?php } else { ?>

<h1>No accesstoken found</h1>
<h3>More than likely you will want to show login page here</h3>

<?php } ?>
</body>
</html>

然后注销就很简单了。以下代码通过将accesstokens设置为expired来删除它们:

代码语言:javascript
复制
setcookie("accesstoken", "", time() - 3600);
setcookie("userid", "", time() - 3600);
header('Location: /youareloggedout.html');

请记住,这是功能登录/注销系统的基础。如果我解释所有需要的安全措施,这篇文章会更长。一定要做你的研究。准备好的语句和防止XSS攻击是您开始学习的一些主题。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45445980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档