楼主提到的这个问题在业界基本有了很成熟的解决方案,但可能还需细化下。这块在网上的资料也是参差不齐,杂七杂八概念实在太多,所以也简单展开一下我认为比较核心的点。
大致需要明确“登录”这个词是什么概念,我们一般用浏览器打开一个网站的时候,属于一个新的“会话”(session),这个会话,登录的过程大致也是给这个 session 赋予某个用户的身份的过程,然后通过这个 session 所作的操作,服务端都默认它是某个用户身份做的。
这个 session 最早应该可以追溯到 telnet bbs 那个时代的,它通过一个 tcp 连接来维持用户的状态。
(随意找的图)
但在 HTTP 协议并没有 tcp 连接那种天然的状态保持,所以一般会用一个随机生成、相互独立、不易伪造的一个 id 作为一个 session key,再结合后端的一个 key-value 存储来保存某个 session key 所包含的 “会话状态”。
一般这个 session key 会通过 cookie 传递,后端通过 文件 / 内存 / 数据库 等方式实现 key-value 存储;有的服务不想维护一个 key-value 存储(类似 Serverless 场景),就依赖密码学签名的手段来处理 session(比如 JWT)。
至于登录过程,最简单的模型,一般会在数据库存储 用户名、哈希后的密码;然后根据用户提交的 用户名、密码,对密码做一次哈希操作,然后与用户名查到的哈希值作比较,确认吻合则放通登录;给这个 session 赋予对应的用户身份权限(一般是设置 uid: xxx )。
小程序的登录验证的话,微信帮助你解决了身份认证(上面的用户名/密码校验)的问题,只需要调一下微信给的 API,后台接收拿到的 code,再换取 openid,有 id 返回,然后这个 session 就和 openid 的身份关联在了一块,就算是登录成功了。
具体的概念刚入坑可能还需要各种搜索展开理解一下~ 加油!