登录究竟有多少种花样?

news2024/11/13 12:48:37

写在最前面:

大家好,我是小....小白不黑,现在的app以及任何一个系统,都离不开登录。其中最常见的估计就是密码登录,二维码登录,第三方账号登录以及单点登录了。

现在,让我们来捋一捋,这些登录的背后,究竟是什么设计的。全篇无图,请谨慎阅读........

一:密码登录

密码认证是最简单的用户认证方案。用户输入密钥,后台查库校验密码,通过则放行,否则则提示“账号或用户名错误”......

对于密码认证,后台通常会结合登录token,来优化登录逻辑:

1、用户输入密码,后台查库校验通过

2、后台缓存token,并返回token给前端

3、前端拿到该token,每次请求后台都以header的形式传递到后台

4、后台通过过滤器/拦截器拿到该token,比对一致则放行

此外,密码为了安全,一般是加密入库保存,而非明文保存。

二:二维码登录

在诸如微信,淘宝等系统,都支持手机扫码登录,那么,二维码认证的背后,又是怎样不为人知的流程呢?其实二维码登录的流程也并不复杂,且听我娓娓道来。

1、浏览器请求二维码,服务器返回二维码及uuid,并缓存uuid。

2、浏览器以此uuid为参数,不断轮询服务器,检查响应结果。

3、手机端扫描二维码,携带手机已登录的token,请求服务器。服务器接收到请求后,先把用户信息关联上uuid(昵称,头像等,此时浏览器还不断在轮询,这样浏览器就能马上解析到用户昵称及头像)

4、服务器响应,要求手机端确认登录。

5、手机端确认登录后,服务端将userId与uuid关联上(redis:key=uuid,value=userid即可)

6、浏览器轮询的时候,服务器通过uuid发现userId已经确认登录,则拿userId查表,拿到用户名密码等信息,生成一个登录token,返回给浏览器。

7、至此,浏览器就借助手机登录状态完成了登录。

但是,当相关系统逐渐多了起来,当用户每次进入一个系统都需要输入一次用户名及密码,一千匹草泥马瞬间奔跑.........因此,也就有了单点登录的方案设计。

三:单点登录

最简单的单点登录设计,其实就是每一个子系统都集成同一个统一认证服务,通过统一认证服务,共享登录状态。

举个例子:

在子系统A中,校验用户名及密码合法后,请求统一认证服务,返回一个凭据token,之后调用任意一个系统,都携带此token。而这里的密码认证,与前面写的大差不差。每一个子系统则通过认证拦截器,携带token调用外部统一认证服务进行认证即可。当然,为了性能,各子系统也会缓存该凭据token,避免每次都需要调用统一认证服务进行身份校验。

对于第三方统一认证服务来说,获取凭据的接口,使用数字签名来鉴别调用者的合法性即可。

数字签名小tips:

非对称加密可以用来加解密以及加签与验签。

加解密的目的是保证数据能秘密传输到目的地,如https协议。前期加密通信,客户端需要拿到服务端的公钥信息,拿此公钥进行加密。而服务端则拿公钥匹配的私钥对数据进行解密。

数字签名的目的是能够标识发送方的身份。因此,发送方需要拿自己的私钥加签,而接收方则可以拿公钥进行验签,保证发送方是一个可信的合法源。

四:使用第三方账号登录:OAuth2.0(客户端模式)

在很多app软件或者网址中,我们都可以看到,可以使用第三方账号进行登录。比如qq浏览器,gittee等,都可以用微信账号进行登录。

首先了解一下什么是Auth2.0:

OAuth是一项协议,它为用户资源的授权提供了一个安全、开放而简易的标准,OAuth的授权不会使第三方触及到用户的账号信息(比如密码),因此OAuth是相对安全的。也就是说,借助OAuth,第三方可以不涉及用户某个平台的账号密码等,也能直接拿到用户在该平台的一些信息。交互流程如下:

1、gittee事先向微信统一认证服务中心申请appId(公钥)与appSecret(私钥),用作签名。并提前注册好回调地址

2、用户使用微信账号登录gitte时,gitte将请求转向微信统一认证服务中心,并携带appId以及数字签名证明自己的身份。

3、微信认证服务中心先是校验该用户有没有登录过(如何判断??)

4、如果未登录,则转向微信的登录页面,反之则前往微信用户授权页面,请求微信用户授权

5、用户点击授权,则认证中心会返回授权码,并前往gitee的回调地址(gitte自己的地址)

6、gittee拿该授权码,前往微信认证中心兑换长期票据(Access Token)

7、gittee获取到长期票据,相当于用户的登录token,也就是gittee获取了访问该用户在微信平台相关数据的权限

整个流程下来,gittee就借助第三方平台的认证功能,完成了用户在Agittee的认证。

来到这里,不知道大家是否会有一个疑问:

为什么认证服务器在用户授权后,返回授权码,而不是直接返回长期票据?

如果直接在重定向的URL中返回长期票据,如果被中间人攻击,长期票据就会泄露。

如果返回授权码,如果中间人拿到授权码,还得需要appId,appSecret才可以兑换长期票据。

但是如果兑换长期票据的时候,发生中间人攻击,那就gg了。只能通过Https等措施巩固安全。

那么来到这里,大家可能又会产生另外一个疑问:

资源服务器怎么验证长期token的有效性?长期token又不是他颁发的?

答案就是:机机鉴权。

认证服务器(认证中心)已经拿了自己的私钥进行加签,并且提前给了一个公钥给资源服务器(微信),资源服务器可以通过公钥进行验签,验证token是否有效。

而认证中心,只需要签发appId与appSecret并提供获取临时票据接口及兑换长期票据接口即可。而签发appId与appSecret,实际就是为了实现机机鉴权(云服务鉴权大多使用此方式做机机认证,如华为云的IAM),临时票据及长期票据,则是为了实现用户授权。

tips小课堂之华为云统一认证服务的机机认证说明:

IAM服务将ak/sk分发给不同的平台,如APIG网关,apig拿sk加签,并请求IAM,然后IAM拿ak验签。验证通过后再返回登录token。apig的下游服务,如果需要iam认证,直接拿apig返回的token调用iam就可以了。跟单点登录的设计是一样的,都是用第三方认证平台来做认证管理,第三方认证平台只需要分发ak/sk给接入了该认证平台的其他第三方平台就可以了。

好了,我是小白不黑,今天的登录就到此为止啦~下期再见!

 ​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【virtuoso】INV 原理图+前仿真 + 版图 + 后仿真

采用SMIC工艺,不同工艺版图窗口可能有差异 1. 原理图&前仿真 1.1 绘制原理图 PMOS: NMOS宽长比2:1 PMOS开启导通电阻大一点,这样设置,可以使得阈值电压是VDD/2 按 i,可以插入器件按p,可以放置端口 1.2…

AXIS接口教程

免责声明: 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济…

Unity3D安卓游戏第三方SDK接入

PS:持续更新... 什么是SDK? SDK(Software Development Kit,软件开发工具包)是一个用于构建应用程序的工具集,包含开发特定软件的必要工具、库、文档和示例代码。SDK通常由软件或硬件厂商提供,帮…

MySQL高阶练习题1- 寻找面试候选人

目录 题目 准备数据 分析数据 实现代码 总结 题目 返回 所有面试候选人 的姓名 name 和邮件 mail 。当用户满足以下两个要求中的 任意一条 ,其成为 面试候选人 : 该用户在 连续三场及更多 比赛中赢得 任意 奖牌。该用户在 三场及更多不同的 比赛中赢得 金牌&…

Linux——用户和权限

root用户(超级管理员) root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。 ****************** 使用普通用户在根目录下创建文件夹 切换到root用户后,继续尝试 普通用户的权限,一般在其HOME目录…

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题 问题描述:在服务器上,我配置了一个虚拟环境,明确指定使用 Python 3.8 版本。然而,当我激活该环境并检查 Python 版本时,意外地发现…

IO练习--随机点名

随机点名器1 需求: 有一个文件里面存储了班级同学的信息,每一个信息占一行。 格式为:张三-男-23 要求通过程序实现随机点名器。 运行效果: 第一次运行程序:随机同学姓名1(只显示名字) 第二次运行程序:随机同学姓名2(只显示名字) 第三次运行程序:随机同学姓名3(只显…

数学建模强化宝典(2)linprog

一、介绍 linprog 是 MATLAB 中用于解决线性规划问题的函数。线性规划是一种优化方法,它尝试在满足一组线性等式或不等式约束的条件下,找到一个线性目标函数的最大值或最小值。linprog 函数适用于求解形如以下问题的线性规划问题: minimizecT…

Native开发与逆向第六篇 -字符串加密与hook

开发demo 写一个简单的字符串加密处理&#xff0c;将字符串字符转成ASCII十六进制值 std::string StrToHex(std::string str){unsigned char c;char buf[3];std::string result "";std::stringstream ss;ss << str;while (ss.read((char *)(&c), sizeof…

Python数据类型转换背后的逻辑

文末赠免费精品编程资料~~ 今天让我们深入浅出地探索Python数据类型转换的奥秘。Python&#xff0c;作为一门灵活的编程语言&#xff0c;其强大的数据类型转换能力是日常编码中不可或缺的一部分。今天&#xff0c;我们将一步步揭开类型转换背后的逻辑&#xff0c;让你从新手进…

【wsl2】从C盘迁移到G盘

参考大神 C盘的ubuntu22.04 非常大&#xff0c;高达30g 迁移后就只有几百M了&#xff1a; 右键有一个move没有敢尝试 迁移过程 Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improveme…

HCCL集合通信算法开发Hello World示例(超详细)

本文给读者介绍了HCCL算法开发所涉及的概念和流程&#xff0c;并通过一个样例将前文介绍的内容串联起来。本文定位为HCCL算法开发的入门介绍&#xff0c;读者读完后&#xff0c;可结合HCCL开放代码仓中的算法样例&#xff0c;做深入研究。 1 什么是集合通信 集合通信定义了一…

Http的get请求中的URL中的占位符参数和查询参数有什么区别

Http的GET请求中的URL中的占位符参数和查询参数在功能、位置和用途上存在明显的区别。 占位符参数&#xff08;Path Variables&#xff09; 定义与位置&#xff1a;占位符参数是通过URL模板中的{}定义的&#xff0c;它们位于URL的路径&#xff08;path&#xff09;部分。例如…

C#文件的输入和输出

一个文件是一个存储在磁盘中带有指定名称和目录路径的数据集合.当打开文件进行读写时,它变成一个流.从根本上说,流是通过通信路径传递的字节序列.有两个主要的流:输入流和输出流.输入流用于从文件读取数据,输出流用于向文件写入数据. C#I/O类 System.IO命名空间有各种不同的类…

带权重的随机算法

假设有10名学生&#xff0c;其中5个男生&#xff0c;5个女生。 要求点到男生的概率为70%&#xff0c;女生的概率为30%。 给男生和女生设置权重&#xff0c;其中男生权重为7&#xff0c;女生权重为3。 public class Test02_case2 {public static void main(String[] args) th…

Expected expression after operator

这个错误直译过来就是:运算符号后没有预期的表达式 这个错误通常出现在编程语言中&#xff0c;尤其是在编写C或C等类型语言的时候&#xff0c;它意味着在源代码中遇到了一个操作符&#xff08;比如 , -, *, /, , 等等&#xff09;&#xff0c;但在该操作符后面没有紧跟相应的表…

【最新华为OD机试E卷】最大利润-贪心的商人(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

Dolphinscheduler 3.2.0版本参数传递并使用switch任务进行判断

原文阅读&#xff1a;【巨人肩膀社区博客分享】3.2.0版本参数传递并使用switch任务进行判断 目标&#xff1a;根据日期判断执行哪项子任务 &#xfeff; 调度器版本&#xff1a;3.2.0 在这个版本中官方支持的参数传递任务类型有6中&#xff0c;分别为shell,sql,procedure,py…

网络压缩之网络剪枝(network pruning)

网络剪枝&#xff08;network pruning&#xff09;就是要把网络里面的一些参数剪掉。剪枝就是修剪的意思&#xff0c;把网络里面的一些参数剪掉。为什么可以把网络里面的一些参数剪 掉呢&#xff1f;这么大的网络里面有很多很多的参数&#xff0c;每一个参数不一定都有在做事。…

AcWing 897. 最长公共子序列

动态规划就是多见识应用题就完事儿了&#xff0c;也没有什么好说的。 讲解参考&#xff1a; 【E05 线性DP 最长公共子序列】 #include<iostream> #include<algorithm> #define N 1010 using namespace std; char a[N],b[N]; int n,m; int f[N][N]; int main(){…