在一些业务要求中"登录"这一操作是需要简化的. 这个功能非常简单, 但同时也非常危险(暴露用户名和密码).
最简单(也是最容易暴露)的记住密码是使用cookie将用户名与密码保留存在客户浏览器中, 下次登录时Javascript将cookie的用户名与密码填入表单中进行登录(或ajax传输用户名密码进行登录).
能直接填入表单(ajax请求)进行登录, 那么cookie保存的信息特别容易暴漏或被盗.
安全的做法是:
当用户登录成功, 服务器返回一个token数据.
客户端接收到返回信息时, cookie将token数据保存在客户端.
如果登录超时需要重新登录时, 程序优先判断客户端是否存在合法的token数据, 如果有生成session记录登录状态.
当然也可以每次用户请求时判断token的合法性, 更新session保持登录状态.
token是MD5(sha1)加密的字符串.
程序安需要生成token, 并在数据库中插入此数据.
客户端每次请求时, 程序会根据传输过来的token检查数据库表中是否存在并查出对应用户数据生成(更新)session.
表机构:
CREATE TABLE IF NOT EXISTS ´xx_token´ (
´id´ int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
´token´ varchar(32) NOT NULL DEFAULT '' COMMENT '',
´user_id´ int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
´create_time´ int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (´id´),
UNIQUE KEY ´token´ (´token´),
UNIQUE KEY ´user_id´ (´user_id´)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '记住密码';
生成token:
$token ->ip() . request()->server('HTTP_USER_AGENT') . $user->id);