资讯专栏INFORMATION COLUMN

从前后端分别学习——注册/登录流程2

happyhuangjinjin / 979人阅读

摘要:昨天研究了网站的注册流程,感兴趣的可以看下从前后端分别学习注册登录流程今天接着研究注册登录流程之登录。为解决这个问题,引入,它是由一组随机数组合的哈希表,当用户登录成功,本来发放给用户,现在变成发放给用户。

昨天研究了网站的注册流程,感兴趣的可以看下:从前后端分别学习——注册/登录流程1

今天接着研究注册/登录流程之登录。

登录

首先来看一下登陆过程:

登录逻辑和注册逻辑基本一致,但登录的过程只对数据库进行读,比对用户的信息是否存在。

登录页面的 HTML 和 CSS 基本一致,这里就不放上来了。

注册成功后跳转

当用户注册成功后,会跳转到登录页面,进入登录页面,发送GET请求,所以需要做一个路由,代码和之前一样,不熟悉的可以看上面该出的链接,这里就不放上来了。

当我检测到服务器成功返回的状态码时,操作页面跳转至登录页面

window.location.herf = "/sign_in"

当用户输入用户名和密码后,点击登录按钮,会发送POST请求,服务器收到请求后,解析前端传过来的数据,并读取数据库将二者的信息进行比对,如果一致就说明是本人。和之前相同的地方,这边就省略了。

let usersString = fs.readFileSync("./db/db","utf8")
let usersArr = JSON.parse(usersString)
let foundUser = false
for(let i = 0; i < usersArr.length; i++){
    if(usersArr[i].email === email && usersArr[i].password === password){
        foundUser = true
        break
    }
}
if(foundUser){
    response.statusCode = 200
    response.write(`{
        "successes":{
            "success":"success"
        }
    }`)
}else{
    response.statusCode = 400
    response.write(`{
         "errors":{
            "email":"foundUser"
        }
    }`)
}

如果对比成功,说明该用户已注册过;如果对比失败,返回对应的响应数据,让前端提示用户。

至此登录流程做完,是不是觉得很简单,在弄懂注册流程后,登录流程基本和它基本一致。

Cookie

登录流程虽然简单,这不是我们今天要研究的重点。

既然网站服务商需要用户祖册,那肯定注册用户和非注册用户能访问的页面肯定不一样,那网站服务商怎么区分注册用户和非注册用户呢?

对,就是Cookie,当用户登录成功后,浏览器会向用户发送一个 Cookie,用户下次请求时会带上Cookie,后端都能匹配上Cookie,就说明他是我们的注册用户,可以访问这个页面;如果Cookie匹配不上,当然就禁止访问了,Cookie具体的参数下一篇讨论,这里先上手直接使用一下,看看效果。

登录成功后跳转页面

当用户登录成功后,让他跳转至首页,首页上显示用户的密码,当然实际工作中不能这样用,这里显示密码以示区分注册用和非注册用户。

密码:__password__

首页非常简单,__password__处只是占位符,如果是注册用户这里会显示对应的密码。

在登录成功后,服务器要给用户发放一个Cookie,这里现已用户的邮箱作为Cookie

response.setHeader("Set-Cookie",`sign_in_email=${email}`)

设置了Cookie之后,可看到响应头中有了Set-Cookie

当跳转首页时,会带上这个Cookie

后端继续做一个路由,当登录首页时,判断用户是否是注册用户,只需要看它的Cookie

读取Cookie

读取Cookie时要注意两点:

Cookie是以"; "间隔,分号后面有空格

如非注册用户访问,没Cookie会报错,初始化时要赋值一个空数组。

if(path === "/home"){
    let string = fs.readFileSync("./home.html","utf8")
    response.setHeader("Content-Type","text/html;charset=utf-8")
    let cookieArr = []    //初始化为空数组
    if(request.headers.cookie){
        cookieArr = request.headers.cookie.split("; ")
    }
    let cookieHashes = {}    //拆分成需要的格式
    cookieArr.forEach((e)=>{
        let part =e.split("=")
        cookieHashes[part[0]] = part[1]
    })
    response.write(string)
    response.end()
}
验证Cookie

服务器发放的Cookie是用户的邮箱,所以这边就比对数据库里的邮箱,如果匹配上,说明是注册用户

let {sign_in_email} = cookieHashes
let usersString = fs.readFileSync("./db/db","utf8")
let usersArr = JSON.parse(usersString)
let foundUser
for(let i = 0; i < usersArr.length; i++){
    if(usersArr[i].email === sign_in_email){    // 验证 Cookie
        foundUser = usersArr[i]
        break
    }
}
权限分配

验证成功,给予访问;验证失败,不给访问。

if(foundUser){
    response.statusCode = 200
    string = string.replace("__password__",foundUser.password)
}else{
    response.statusCode = 400
    string = string.replace("__password__","未注册")
}

验证成功

验证失败

Session

Cookie有个很大的问题:用户可以随意更改,如果有人知道了Cookie的规律,那他就可以随意获取用户信息了。

为解决这个问题,引入Session,它是由一组随机数组合的哈希表,当用户登录成功,本来发放Cookie给用户,现在变成发放Session给用户。

具体看下怎么实现呢

var sessions = {}
sessions[sessionId] = {sign_in_email:email}
response.setHeader("Set-Cookie",`sessionId=${sessionId}`)

之前发放的Cookie,现在变成了Session

服务器不能在读Cookie了,也要变成读取Session,才能正常显示

let sessionsArr = []
if(request.headers.cookie){
    sessionsArr = request.headers.cookie.split("; ")
}
let sessionHashes = {}
sessionsArr.forEach((e)=>{
    let part =e.split("=")
    sessionHashes[part[0]] = part[1]
})
//通过读取用户的 sessionId 比对 session 表中的 email
let sign_in_email
if(sessionHashes.sessionId){
    sign_in_email = sessions[sessionHashes.sessionId].sign_in_email
}

上面代码都一样,这里换了个变量而已,只有最后一句不一样,如果sessionId存在才能找到session表中的用户邮箱。

总结

经过两天研究注册和登录流程,弄清楚了各个环节,详细的过程如上图所示,有2点需要了解:

Cookie不可靠,用户可随意更改

Session一般用随机数表示,增强了安全性,缺点太占内存

通过这次学习不仅对ajaxPromise等技术了解更深,也大致明白了后端的工作流程。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108396.html

相关文章

  • 从前后端分别学习——注册/登录流程1

    摘要:上面的写法有个问题点击按钮发送请求后,客户端一直收不到响应,就会报错其实传送的时是一个异步的过程,里面还没执行完,外面就已经执行了,这边可以用来解决下这个问题内部返回一个对象,成功调用函数,失败调用函数,这边就默认它会成功。 今天来研究一个小小的功能。当我们进入一个网站,它怎么判断我是不是它的用户?让用户登录呗,如果它能正常登录,它就是我的用户呗?你有没想过它是怎么判断我是不是它用户的...

    Gemini 评论0 收藏0
  • Vue中的验证登录状态

    摘要:用存储用户路由守卫路由中设置的字段就在当中每次跳转的路径登录状态下访问页面会跳到如果没有访问任何页面。一个简单的保存登录状态的小。 Vue项目中实现用户登录及token验证 先说一下我的实现步骤: 使用easy-mock新建登录接口,模拟用户数据 使用axios请求登录接口,匹配账号和密码 账号密码验证后, 拿到token,将token存储到sessionStorage中,并跳转到首...

    draveness 评论0 收藏0
  • react技术栈实践(从前到后撸一个电影搜集应用)

    摘要:其实,该复杂的东西在哪放都复杂,只不过现在更清晰一点使用不好的地方就是太繁琐了,定义各种各种组件。。。。。 之前做了个好电影搜集的小应用,前端采用react,后端采用express+mongodb,最近又将组件间的状态管理改成了redux,并加入了redux-saga来管理异步操作,记录一些总结 在线地址 手机模式 源码 主要功能 爬取豆瓣电影信息并录入MongoDB 电影列表展示...

    tigerZH 评论0 收藏0
  • 迈出全栈第一步,vue+node+mysql独立完成前后端分离的增删改查流程

    摘要:本使用创建本地服务器,在就能完成全部流程,并不需要线上服务器。路径要与后端接口一致。后端返回成功后,前端数据中对应的元素也要删掉,更新视图。控制器里拿一个方法出来说一下吧,完整的代码都在。读取操作完成后调用释放连接。 写在前面 本文只是本人学习过程的一个记录,并不是什么非常严谨的教程,希望和大家一起共同进步。也希望大家能指出我的问题。适合有一定基础,志在全栈的前端初学者学习,从点击按钮...

    fsmStudy 评论0 收藏0

发表评论

0条评论

happyhuangjinjin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<