欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

javascript - 小白问题!关于PHP,JS和Token

程序员文章站 2024-01-07 17:09:28
...
是这样的,本人想用html/css/js来做一个Android的Hybrid APP,用的是Cordova来包装。
至于Server方面则是PHP。

我想用Token来替代Session来判断用户的登录状态,因为完全就是个小白,第一次接触Token,不清楚流程。
我的问题将(括号)起来

我的设想是这样:

  1. 用户点击登录后,用Ajax发送用户名和密码到Server,判断用户信息无误后php生成一个Token(怎么生成?需要拿用户信息来生成吗?需不需要加密?怎么加密?)。

  2. 然后生成的Token存在数据库,再把Token传回给用户APP(用什么传,JSON安全吗,怎么确保Token不被截取,或截取了也没办法干什么坏事),并储存在APP本地。

  3. 登录后跳转到新的页面,新的页面一开始就会Ajax发送存在本地的用户名和Token,如果Token和数据库的不相同就会被取消登录状态,跳转回登录页面。(Token需不需要一段时间更新一次,还是待到用户下一次登录的时候才更新?如果需要更新,那么推荐的更新间隔时长是多久?)

  4. 用户的每个会与Server进行沟通的操作都要进行Token验证【如第三步】。(需不需要每个操作都验证,这样会不会照常Server和Database的负担,最重要的是用户APP方面效率会不会很差?)

希望有人帮帮我这个小白,网上搜寻了很多都找不到我想要的答案。。。

回复内容:

是这样的,本人想用html/css/js来做一个Android的Hybrid APP,用的是Cordova来包装。
至于Server方面则是PHP。

我想用Token来替代Session来判断用户的登录状态,因为完全就是个小白,第一次接触Token,不清楚流程。
我的问题将(括号)起来

我的设想是这样:

  1. 用户点击登录后,用Ajax发送用户名和密码到Server,判断用户信息无误后php生成一个Token(怎么生成?需要拿用户信息来生成吗?需不需要加密?怎么加密?)。

  2. 然后生成的Token存在数据库,再把Token传回给用户APP(用什么传,JSON安全吗,怎么确保Token不被截取,或截取了也没办法干什么坏事),并储存在APP本地。

  3. 登录后跳转到新的页面,新的页面一开始就会Ajax发送存在本地的用户名和Token,如果Token和数据库的不相同就会被取消登录状态,跳转回登录页面。(Token需不需要一段时间更新一次,还是待到用户下一次登录的时候才更新?如果需要更新,那么推荐的更新间隔时长是多久?)

  4. 用户的每个会与Server进行沟通的操作都要进行Token验证【如第三步】。(需不需要每个操作都验证,这样会不会照常Server和Database的负担,最重要的是用户APP方面效率会不会很差?)

希望有人帮帮我这个小白,网上搜寻了很多都找不到我想要的答案。。。

1,用户登录生成一个唯一值token存入redis数据库(token的生成:可以使用 random_int(), random_bytes(), or openssl_random_pseudo_bytes()函数生成一个随机数加上该用户的ip。如果你希望更安全一点,还可以进行一些变换,具体怎么做你可以看看密码学方面的书籍。);
2,所有网络请求必须使用https,否则token很容易被窃取。(web程序不能保护token,因为web网页的算法会写在js里面,js文件可以被浏览,所以别人浏览js文件就知道了你的算法,即使js被混淆也还是不安全,安卓和ios程序如果被破解算法也会被别人知道,所以最好的方案还是使用https);
3,token必须设置过期时间,这个时间随意,并没有特别的限制,可以让产品人员设定。如果没有人来定,可以使用15分钟;
4,如果需要用户登录才能访问的内容每次请求都必须带上token,并且要进行token验证。(这也是为什么使用redis而不是mysql存储token的原因,提高请求速度);默认php使用文件存储session,每次都要读取文件,其实也会有性能损失,并不一定比读数据库性能会好。所以你不需要担心读数据库导致的性能问题。
5,如果是web网页程序,一般登录后可以把token存储在cookie里面, 同时设置HTTP-Only(表示该cookie值不能被js读取)

你的流程看着我不是很明白。给你一个思路,token的作用在于这是一个不能篡改的字串,篡改后即无效,前端的任何数据都是可以非法篡改的。1:用户登陆后PHP读取用户的token并输出到页面,token一般有用户标识token和用户身份token,当然用一个也可以看你后端token的检验算法。2:前端和后端数据交互时,将数据和token传入后端,token起到用户身份及标识的作用。前端不应该将用户名和密码传入后端。token若发生篡改则检验失败。3:token的生成跟用户信息并不需要有任何关联,token由认意位数的仁意字符串组成,存进数据库中,token的生命周期看你需求,一般生成一次永久使用即可,数据库中的user表中增加token字段用于存储token,或者建立一张表,将user_ID和token关联。