登录认证几乎是任何一个系统的标配,web 系统、APP、PC 客户端等,好多都需要注册、登录、授权认证 。场景说明
以一个电商系统,假设淘宝为例,如果我们想要下单,首先需要注册一个账号 。拥有了账号之后,我们需要输入用户名(比如手机号或邮箱)、密码完成登录过程 。之后如果你在一段时间内再次进入系统 , 是不需要输入用户名和密码的,只有在连续长时间不登录的情况下(例如一个月没登录过)访问系统,再次需要输入用户名和密码 。如果使用频率很频繁 , 通常是一年都不用再输一次密码,所以经常在换了一台电脑或者一部手机之后,一些经常使用的网站或 APP 不记得密码了 。
提炼出来整个过程大概就是如下几步:
- 首次使用,需要通过邮箱或手机号注册;
- 注册完成后 , 需要提供用户名和密码完成登录;
- 下次再使用,通常不会再次输入用户名和密码即可直接进入系统并使用其功能(除非连续长时间未使用);
【java开发中有哪些登录方法】
OAuth 认证
OAuth 认证比较常见的就是微信登录、微博登录、qq登录等,简单来说就是利用这些比较权威的网站或应用开放的 API 来实现用户登录 , 用户可以不用在你的网站或应用上注册账号,直接用已有的微信、微博、qq 等账号登录 。
这一样一来,即省了用户注册的时间,又简化了你的系统的账号体系 。从而既可以提高用户注册率可以节省开发时间,同时,安全性也有了保障 。
维基百科对它的解释摘要如下:
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据 。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频) 。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容 。假设我们开发了一个电商平台,并集成了微信登录 , 以这个场景为例,说一下 OAuth 的工作原理 。
讲之前需要了解其中涉及到的几个角色:
- 用户:即使用我们平台的用户
- 用户终端:即最终用户使用的 APP 端或 web 端
- 应用服务器端:即我们的服务器端
- 授权服务器端:这里就是微信处理授权请求的服务器
- 我们电商平台的用户过来登录,常用场景是点击“微信登录”按钮;
- 接下来,用户终端将用户引导到微信授权页面;
- 用户同意授权,应用服务器重定向到之前设置好的 redirect_uri (应用服务器所在的地址) , 并附带上授权码(code);
- 应用服务器用上一步获取的 code 向微信授权服务器发送请求,获取 access_token,也就是上面说的令牌;
- 之后应用服务器用上一步获取的 access_token 去请求微信授权服务器获取用户的基本信息 , 例如头像、昵称等;
早期互联网以 web 为主,客户端是浏览器,所以 COOKIE-Session 方式最那时候最常用的方式,直到现在,一些 web 网站依然用这种方式做认证 。
认证过程大致如下:
- 用户输入用户名、密码或者用短信验证码方式登录系统;
- 服务端验证后,创建一个 Session 信息,并且将 SessionID 存到 COOKIE,发送回浏览器;
- 下次客户端再发起请求,自动带上 COOKIE 信息,服务端通过 COOKIE 获取 Session 信息进行校验;
- 只能在 web 场景下使用,如果是 APP 中,不能使用 COOKIE 的情况下就不能用了;
- 即使能在 web 场景下使用,也要考虑跨域问题,因为 COOKIE 不能跨域;
- COOKIE 存在 CSRF(跨站请求伪造)的风险;
- 如果是分布式服务 , 需要考虑 Session 同步问题;
由于传统的 COOKIE-Session 认证存在诸多问题,可以把上面的方案改造一下 。改动的地方如下:
- 不用 COOKIE 做客户端存储,改用其他方式 , web 下使用 local storage,APP 中使用客户端数据库 , 这样就实现了跨域,并且避免了 CSRF ;
- 服务端也不存 Session 了,把 Session 信息拿出来存到 Redis 等内存数据库中,这样即提高了速度,又避免了 Session 同步问题;
- 用户输入用户名、密码或者用短信验证码方式登录系统;
- 服务端经过验证,将认证信息构造好的数据结构存储到 Redis 中,并将 key 值返回给客户端;
- 客户端拿到返回的 key,存储到 local storage 或本地数据库;
- 下次客户端再次请求,把 key 值附加到 header 或者 请求体中;
- 服务端根据获取的 key,到 Redis 中获取认证信息;
上面的方案虽然经过了改版,但还是需要客户端和服务器端维持一个状态信息,比如用 COOKIE 换 session ,或者用 key 换 Redis 的 value 信息,基于 JWT 的 Token 认证方案可以省去这个过程 。
JSON Web Token(JWT)是一个非常轻巧的规范 。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息 。
认证过程
- 依然是用户登录系统;
- 服务端验证,将认证信息通过指定的算法(例如HS256)进行加密,例如对用户名和用户所属角色进行加密 , 加密私钥是保存在服务器端的,将加密后的结果发送给客户端,加密的字符串格式为三个”.” 分隔的字符串 Token,分别对应头部、载荷与签名,头部和载荷都可以通过 base64 解码出来,签名部分不可以;
- 客户端拿到返回的 Token,存储到 local storage 或本地数据库;
- 下次客户端再次发起请求,将 Token 附加到 header 中;
- 服务端获取 header 中的 Token , 通过相同的算法对 Token 中的用户名和所属角色进行相同的加密验证,如果验证结果相同,则说明这个请求是正常的,没有被篡改 。这个过程可以完全不涉及到查询 Redis 或其他存储;
- 使用 json 作为数据传输,有广泛的通用型,并且体积?。阌诖洌?/li>
- 不需要在服务器端保存相关信息;
- jwt 载荷部分可以存储业务相关的信息(非敏感的),例如用户信息、角色等;
综上所述,JWT 可以作为首选的认证方案 。当然,具体的情况具体分析 , 还要看是不是适合真实的应用场景 。除了上述的这些,涉及到信息安全的,建议全部采用 https 方式部署,采用 https 方式 , 信息很难被嗅探破解,对应用的安全性很重要 。
Java开发中随不同应用,有各种不同的登陆方法:
1、最简单的,通过用户和密码登录 。
2、如果在企业B端系统 , 用户需要登录很多个系统 , 每个系统都有每个系统的用户名和密码,他们很难记?。词股柚贸上嗤挠没兔苈?nbsp;, 但需要改密码的时候,每个系统都要修改,十分麻烦,这时,就需要实现单点登录 。
3、如果在多租户系统中 , 如OFBIZ多租户系统,是从OFBIZ的单一副本运行的单独的数据实例的能力 。每个数据实例保存在制定给租户的一个单独的数据库中 。用户通过登录表单的形式制定租户ID登录到一个数据实例 。必须进行多种配置才能使用OFBIZ多租户 。这时,登陆不仅需要用户和密码 , 而且还需要TenantId , 见下图
4、如果需要更加安全的登陆,比如各个银行的网银系统,税务的报税系统,需要用户本地安装有效地数字证书才能登陆 。
5、区块链登陆,本质上也是采用数字证书的方式登陆 。比如区块链钱包 , 需要澄清的是,区块链领域提到的钱包其实并不是装钱的钱包,而是装密钥(私钥和公钥)的工具,有了密钥就可以拥有相应地址上的数字货币的支配权 。私钥:是对一个比特币地址拥有取钱权限的代表,掌握了私钥就掌握了其对应比特币地址上的所有生杀大权 。私钥可以算出公钥 , 公钥可以再算出比特币地址 。每次交易的时候,付款方必须出具私钥,以及私钥产生的签名,每次交易签名不同,但是由同一个私钥产生 。私钥是一串 。公钥:是和私钥成对出现的 , 公钥可以算出比特币地址,因此可以作为拥有这个比特币地址的凭证 。比特币地址:如果说区块链是一个账本,比特币地址就是其中的账号 。如果我们把比特币钱包简单比作成银行卡账户的话 , 那么比特币钱包地址就可以看成是银行卡账号 。不同的是,比特币地址是可以不存储在网络上的,更是可以独立于你的钱包而存在的 。
总之,根据不同的要求 , 可以采用不同的机制实现系统的登陆 。