登录的实现方案有哪些?

2023-05-04  本文已影响0人  赵客缦胡缨v吴钩霜雪明

登录鉴权是互联网信息交互中常见的话题,登录的实现方案有哪些呢?

常见的登录实现方案有一下几种:

  • Cookie + Session 登录
  • Token 登录
  • SSO 单点登录
  • OAuth 第三方登录
  • 扫码登录
  • 一键登录

Cookie + Session 登录

大家都知道,HTTP 是一种无状态的协议。

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求返回数据,但不会记录任何信息。

为了解决 HTTP 无状态的问题,出现了 Cookie。

Cookie 是服务器端发送给客户端的一段特殊信息,这些信息以文本的方式存放在客户端,客户端每次向服务器端发送请求时都会带上这些特殊信息。

在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。

当用户登录成功后,服务端会将登录状态记录到 Session 中,同时需要在客户端保存一些信息(SessionId),并要求客户端在之后的每次请求中携带它们。

在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将 SessionId 保存到 Cookie 中,当服务端收到请求后,通过验证 Cookie 中的 SessionId 来判断用户的登录信息。

Cookie + Session 实现流程

Cookie + Session 的登录方式是目前最经典的一种登录方式,现在仍然有大量的场景在使用。

具体可以采用以下步骤:

  • 用户输入用户名和密码,前端将用户提交的用户名和密码发送到后端进行验证。
  • 后端验证用户信息是否正确,并创建一个SessionSession是一种服务器端保存用户会话信息的机制,用于识别多次请求之间的逻辑关系。
  • 后端将Session ID(通常是一个随机的字符串)返回给前端,并通过 Cookie 的方式将Session ID保存在浏览器中。这样就可以保证当用户再次发送请求时,后端可以通过该 Session ID 来识别用户身份,并完成相关的操作。
  • 在后续的请求中,浏览器会自动将保存的 Cookie 信息发送到后端进行验证,如果 Session ID有效,则返回相应的数据。如果 Session ID 失效或者不存在,则需要重新登录获取新的 Session ID
  • 在用户退出时,后端需要删除对应的 Session 信息,以保证安全性。

需要注意的是,CookieSession 方案也存在一些安全问题。

例如,如果攻击者可以获取到 Cookie 信息,则可以模拟用户身份进行恶意操作。

因此,在实现时需要考虑添加一些安全措施,如:

Cookie + Session 的缺点

当然,它也存在一些缺点:


Token 登录

为了解决 Cookie + Session 机制暴露出的诸多问题,我们可以使用 Token 的登录方式。

Token 是通过服务端生成的一串字符串,以作为客户端请求的一个令牌。当第一次登录后,服务器会生成一个 Token 并返回给客户端,客户端后续访问时,只需带上这个 Token 即可完成身份认证。

Token 机制实现流程

Token 登录方案是一种常用的前后端分离技术,具体流程如下:

  • 用户输入用户名和密码,前端将用户提交的用户名和密码发送到后端进行验证。
  • 后端验证用户信息是否正确,并生成一个 Token。Token 是一串加密的字符串,包含了用户的身份信息和权限等相关信息。
  • 后端将 Token 返回给前端,并保存在客户端的LocalStorage或者SessionStorage中。
  • 每次向后端发送请求时,前端都需要在请求头部携带 Token 信息。
  • 后端接收到请求后会从 Token 中解析出用户身份信息,并通过权限校验等操作来判断请求是否合法。
  • 如果校验通过,则返回相应的数据,否则返回错误信息。
  • 在用户退出时,前端需要删除保存的 Token 信息。

需要注意的是,由于 Token 信息存储在客户端,因此不同于 Session 机制,它可以轻松地跨域使用,而且不需要考虑 Session 共享、分布式管理等问题。

同时,由于 Token 机制不依赖服务器端的资源,因此在大规模高并发访问时,它具有更好的性能表现。

然而,由于 Token 信息存储在客户端,因此存在一定的安全风险,例如 Token 被盗用、被篡改等问题。

为了保证安全性,需要采取一些安全措施,如:

Token 生成方式

Token 的生成方式通常有以下几种:

无论采用哪种方式生成 Token,都需要结合实际业务场景和安全需求来选择,并且需要对 Token 进行加密或者数字签名等操作来保障其安全性。同时,在 Token 的过期时间、密钥管理、Token 注销等方面都需要考虑相应的安全措施。

Token 登录的缺点


SSO 单点登录

SSO(Single Sign-On,单点登录)是一种在多个应用程序(比如 Web 服务)中实现认证和授权的方法。它允许用户只需登录一次,就可以访问多个应用程序,大大提高了用户体验和工作效率。

SSO 的基本流程

SSO 的实现方式

该实现方式将 Token 存储在 Cookie 中,并通过浏览器的同源策略来共享 Token 信息。由于 Cookie 只能在同域名下共享,因此该方式仅适用于同域名下的应用程序。

该实现方式将 Token 信息存储在服务器端的 Session 中,并通过 Session ID 来共享 Token 信息。由于 Session 机制通常需要依赖某种中心化的 Session 管理系统,因此实现较为复杂。

认证中心就是一个专门负责处理登录请求的独立的 Web 服务。用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的)。

应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心进行登录。由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL ,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统。

应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(这个 Cookie 是当前应用系统的,其他应用系统是访问不到的)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,于是就不会有认证中心什么事了。

此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。

该实现方式采用 OAuth 协议来实现用户身份验证和授权。OAuth 是一个开放标准,用于在不同域名下的应用程序之间安全地共享资源和授权访问。该实现方式具有良好的兼容性和可扩展性,但需要额外的授权服务器和令牌管理机制。

该实现方式是在 OAuth2.0 协议上构建的一个开放标准,用于实现用户身份验证和授权。它继承了 OAuth 的优点,并提供了更丰富的身份认证和授权机制。该实现方式具有较高的兼容性和安全性,但需要额外的授权服务器和令牌管理机制。

SSO 单点登录退出

SSO 单点登录的缺点


OAuth2 第三方登录

OAuth是一种常用的开放标准协议,用于在不同应用之间安全共享用户资源(如个人信息、照片、视频等)。

目前已经发展到OAuth2.0版本,相较于1.0版本更加关注客户端开发者简易性,而且为桌面应用、web应用、手机设备提供专门认证流程。

而第三方登录则是OAuth协议中的一种应用场景。具体来说,第三方登录是指用户选择使用第三方平台的身份认证服务来登录某个应用程序。

OAuth2.0标准定义四种角色:

其实 OAuth2.0 标准定义四种授权模式:

四种授权模式中最常用的是授权码模式

授权码模式是指第三方应用先申请一个授权码,然后再用该码获取令牌。这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

基本流程

授权码方式授权大体上分为四步:

以微信登录为例,当用户在某个网站或应用上选择使用微信登录时,该网站会向微信发送一个授权请求,微信会提示用户确认授权,并返回一个令牌(access token)给该网站,该网站通过验证令牌的有效性后,即可实现用户的自动登录和获取用户的相关信息。

OAuth2优势

相比于传统的用户名密码登录方式,第三方登录具有以下优势:

需要注意的是,虽然第三方登录可以提高用户体验和安全性,但也存在一些潜在的安全风险,例如用户授权过多、第三方平台信息泄漏等问题。

因此,在实际的开发和应用中,需要合理选择第三方平台、进行授权管理、保护用户隐私等措施,以确保用户数据的安全性和可靠性。


扫码登录

扫码登录是一种快捷方便的登录方式,用户只需要通过扫描二维码即可完成登录操作,无需输入用户名和密码等信息。在网页、APP 等应用中广泛应用,可以提高用户使用体验和安全性。

基本流程

以扫码登录某个网站为例:

真实案例

以“前端面试题宝典”的 PC 端登录为例,就是使用了微信扫码能力和小程序的授权功能。

首先,PC 端在进行登录操作时,会从后端请求一个临时的小程序二维码进行展示,二维码中会包含一个 id 参数,并根据该 id 轮询扫码状态。

引导用户使用微信扫码后,会在微信中打开“前端面试题宝典”小程序,跳转到小程序中一个专门的授权登录页面,并在该页面会请求用户的部分数据。

用户确定授权后,会将授权数据同步给后端。

PC 端在下次轮询时拿到授权成功的状态及用户头像等数据,完成登录操作。

扫码登录优势

扫码登录有以下优势:

当然,由于扫码登录需要使用到第三方平台,例如微信、支付宝等,可能会涉及到第三方的隐私问题和数据共享问题。


一键登录

一键登录,也叫“本机号码一键免密登录”,是指用户在移动端应用或网站中,通过验证手机号快速完成登录的方式。

这是一种更为“懒人”的验证方式,既不需要用户输入账号密码,也不需要输入手机号来获取短信验证码,接受协议后,直接由运营商帮助APP取号验证,用户可以点击一键登录。

相比于传统的账号密码登录方式,一键登录更加方便快捷,并且可以免除密码管理和找回密码等问题。

一键登录的原理

要使用一键登录,需要接入运营商的 SDK,三大运营商使用了同一套授权流程:

主要步骤如下:

调用 SDK 的初始化方法,传入项目在平台上的 AppKeyAppSecret

调用 SDK 唤起授权接口。SDK 会先向运营商发起获取手机号掩码的请求,请求成功后跳转到授权页。授权页会显示手机号掩码以及运营商协议给用户确认。

用户同意相关协议,点击授权页面的登录按钮,SDK 会请求本次取号的 token,请求成功后将 token 返回给客户端。

将获取到的 token 发送到我们自己的服务器,由服务器携带 token 调用运营商一键登录的接口,调用成功就返回手机号码了。服务器用手机号进行登录或注册操作,返回操作结果给客户端,完成一键登录。

在没有插电话卡,或者关闭移动蜂窝网络的情况下,是无法完成认证的。所以就算接入了一键登录,我们也要兼容传统的登录方式,允许用户在认证失败的情况下,手动输入手机号登录。

小结

Cookie + SessionTokenSSO单点登录是常见的身份认证和授权方案,它们各有特点:

需要注意的是,根据具体业务需求和安全要求,可以选择不同的身份认证和授权方案,并在实现时结合一些安全措施来保障用户信息的安全性。同时,在使用 Token 和 SSO 单点登录方案时,还需要对 Token 和认证中心进行管理和维护,以保证其正常运行和可靠性。

上一篇下一篇

猜你喜欢

热点阅读