资讯专栏INFORMATION COLUMN

登录那些事儿

layman / 647人阅读

摘要:假如是在同一个域名下,例如与,因为允许设置到二级域名下,所以和是可以共享的,用户的信息可以通过可逆加密放在二级域名下的,并且设置,就可以一站登录,站站登录。

原文链接:BlueSun | 登录那些事儿

也不知道是什么原因,刚开始不久的职业生涯,在技术这条路走着走着,和「登录」总是有着一个不解之缘。还记得当初学习Web编程的时候么?不管是Java、.Net、PHP,继经典「Hello World」之后,要写的很有可能就是「登录」功能。至今「登录」的问题还是让我心中一万只草泥马奔过。
下面,给分享一下各种「登录」相关的需求

普通的登录

这个是极其普通的登录需求,要的就是一个登录页面,输入账号密码,提交Form表单,后端查询数据库对应用户名的密码,匹配正确则把用户记录到Session,不正确则返回错误。
这种登录,在上学的时候,也许敬爱的老师就已经教过你了。
但可能他没有教你的是,密码需要hash加密,session为什么可以记录登录用户的原理。

密码Hash
密码hash,就是存进数据库的密码是一串密文,密文是明文密码通过不可逆算法得出的。在Nodejs中,你可以使用bcryptjs,它提供了hash以及对应的compare方法,非常适合用于密码的加密和对比。

Session原理
Session的原理其实还是依赖了Cookie,所以Cookie才是记录用户凭证的真理。它的原理大概是酱紫的:服务器端维护一个session的表,这个表的每一条记录存的就是与某一个客户端的会话,会话会有过期时间,过期的会话会被清理。然后这个会话,会有一个对应的id,一般是一串长长的看不懂的字符串,然后这个字符串会被存储在客户端的cookie中,每一次请求服务器端都会带上这个cookie,服务器端就知道访问的就是哪个客户端了。
欲知更多有关「Session原理」请点击传送门:Session原理

使用独立登录系统

应项目需要,登录逻辑需要独立出来做成一个系统,就是另外一个项目。与原来的主站不是在同一个项目中了。一个域名是 www.site.com,一个则是passport.site.com了。要在不同的域名下进行登录,一般的方法是www.site.com/login 跳转到 passport.site.com/login,passport这边是一个登录页面,用户输入账号密码登录成功之后,passport会通过带着一个可逆加密的包含用户信息的token,重定向到www.site.com提供的回调处理地址,然后进行解密,匹配正确,则登录用户。
要注意的是,这里的加密的信息需要包含一个时间戳,接收方需要认证这个时间戳,过期登录失败。避免token被窃取,被无限登录site系统。

单点登录

单点登录需要实现的需求,说白了就是在站点A的登录了,那么用户就自动在站点B、站点C、站点E、F、G登录。
这又分两种情况,A站点和B站点是否在同一个二级域名下。
假如是在同一个域名下,例如siteA.site.comsiteB.site.com,因为cookie允许设置到二级域名下.site.com,所以siteA和siteB是可以共享cookie的,用户的信息可以通过可逆加密放在二级域名下的cookie,并且设置http only,就可以一站登录,站站登录。
而如果A站点和B站点不在同一二级域名下,例如www.siteA.comwww.siteB.com,他们就无法通过共享cookie的方式共享用户信息,所以需要用到jsonp的方式,用户在siteA登录之后,提供一个jsonp接口获取加密的用户信息,siteB访问这个jsonp获取加密信息。达到共享用户状态的效果。
欲知更多有关「单点登录」请点击传送门:单点登录的三种实现方式

OAuth2.0登录

这就比较普遍了,现在随随便便做个网站,都接入「微信登录」、「微博登录」、「豆瓣登录」、「QQ登录」、「Github登录」、@^&@%#^%^@%&%@........
这些统一叫做:「第三方登录」。
第三方登录都是实现了OAuth2.0协议的,流程大概是酱紫的:
第三方提供一个登录入口,也就是第三方域名下的登录页面。主站需要登录的时候,引导用户重定向到第三方的登录页面,用户输入账号密码之后,登录第三方系统,第三方系统匹配帐号成功之后,带上一个code到主站的回调地址,主站接收到code,短时间内拿着code请求第三方提供获取长期凭证的接口(因为code有一个比较短的过期时间),这个长期凭证叫access_token,获取之后就把这个access_token存到数据库中,请求一些第三方提供的API,需要用到这个access_token,因为这个token就是记录用户在第三方系统的一个身份凭证。
一些系统,在获取access_token的时候,还会返回一个副参数refresh_token,因为access_token是有过期时间的,一旦过期了,主站可以使用refresh_token请求第三方提供的接口获取新的access_token以及新的refresh_token
在Nodejs中,你可以使用passport来给第三方登录提供一个统一解决方案,而如果你是开发「微信公众号」授权,除了passport,也可以使用wechat-oauth

在最后

其实登录问题,理解了Session原理是很重要的,这个也不难理解。然后站点之间的用户信息交流,就是通过各种跨域限制,各种加密解密而已。在做这个的时候,需要充分考虑到加密的token是否会被窃取的可能性,还要考虑让这个token加上时间的验证,在一些可能会被窃取,安全需求比较高的情况,就需要把token的时间设置的更短。还有就是加密的方式需要依照需求不同而选择可逆或者不可逆,hash sha1还是JWT(Json Web Token)。
sha1加密,可以使用Nodejs自带的crypto,JWT可以使用[jsonwebtoken]()

如果本文对您有用
请不要吝啬你们的Follow与Start
这会大大支持我们继续创作

「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080

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

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

相关文章

  • Cookie&Session,登录那些事儿~

    摘要:什么叫保持登录状态比如说我在百度页面进行了登录,但是不找个地方记录这个登录态的话。那我去页面,我的登录态怎么保持呢难道要携带吗这肯定是不安全的。你让用户再登录一次登个鬼,再见为什么需要登录态? 因为需要识别用户是谁,否则怎么在网站上看到个人相关信息呢? 为什么需要登录体系? 因为HTTP是无状态的,什么是无状态呢? 就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。 我们...

    terro 评论0 收藏0
  • Coding UI 测试的那些事儿

    摘要:设想下,如果有段程序,自动把你打开浏览器,然后跳转到百度首页。分为江湖传言今年圣诞节会发布,主要是增强对移动端浏览器的测试。至于百度搜出来的那坨,诶,,往事不堪回首。这是面向用户的最终测试。 一般来说对一个网站做测试,最直接的方法就是用手点,眼睛看。用手点和眼睛看把网站的功能点都过一遍,比如在百度首页的搜索框里输入 coding,点击百度一下,用眼睛看会不会弹出有关 coding 的搜...

    Coly 评论0 收藏0
  • 大话javascript 7期:Cookie、Session和Token的那些事儿

    摘要:服务器检查该,以此来辨认用户状态。如果为,表示删除该。防篡改签名服务器为每个项生成签名。服务端根据接收到的内容和签名,校验内容是否被篡改。算法得到的签名和请求中数据的签名不一致,则证明数据被篡改。 一、登录认证机制 随着互联网的不断发展,无论是网站还是app,一般都会要求用户注册/登录。主要的登录方式有账户密码登录、第三方登录(微信登录、QQ登录、微博登录等) 登录可分为三个阶段(登录...

    tianren124 评论0 收藏0
  • 数据库时区那些事儿 - Oracle的时区处理

    摘要:本文探究了及其驱动对于时区的处理方式,并尝试给出最佳实践。和类似,不过存储的数据会标准化为数据库的时区,用户获取它的时候会转换成用户时区对于来说,就是时区。而和返回的则是数据库所在操作系统所在时区的时间。 原文地址 当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docker Imag...

    Chaz 评论0 收藏0
  • 数据库时区那些事儿 - Oracle的时区处理

    摘要:本文探究了及其驱动对于时区的处理方式,并尝试给出最佳实践。和类似,不过存储的数据会标准化为数据库的时区,用户获取它的时候会转换成用户时区对于来说,就是时区。而和返回的则是数据库所在操作系统所在时区的时间。 原文地址 当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docker Imag...

    snowLu 评论0 收藏0

发表评论

0条评论

layman

|高级讲师

TA的文章

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