当前位置: 首页 > Web前端 > HTML

终于有人把前端认证搞清楚了

时间:2023-03-28 12:02:41 HTML

什么是认证?认证也称为身份认证,是指验证用户是否可以访问系统。就像我们经常在动车上拿的账单一样(对应的标志,一定的时间范围)。认证方式下面介绍一下我们工作中常用的几种认证方式。Session-Cookie认证是利用服务器端的Session(会话)和浏览器(客户端)的Cookie实现前后端通信的认证方式。来源由于HTTP请求是无状态的,服务器在正常情况下是无法知道请求发送者的身份的。这时候,如果我们要记录状态,就需要在服务器上创建一个session,在自己的session记录中维护同一个client的请求。每当一个请求到达服务器,首先检查请求中的用户ID是否存在于Session中,如果存在则说明认证成功,否则说明认证失败。流程实践老大(我们的产品之一)这里把SessionID存入数据库,缓存在Memcached中。客户端每次调用接口都会通过响应头中的Set-Cookie更新过期时间(老大这里设置为6小时)。这是为了防止cookie在你进行一些复杂的操作时突然过期。??整个过程比较繁重,因为每次调用接口都要更新过期时间。优缺点优点:使用方便,浏览器会自动带上缺点:不能脱离浏览器使用,比如原生应用中cookie的安全问题Cookie属性:提高安全性的方法Expires/Max-Age设置合理的过期时间timeHttpOnlysettingsettrueSecuretotrue(使用https)Token认证源负载均衡多台服务器,不容易确认当前用户是否登录,因为多台服务器不共享Session。这个问题也可以通过将Session存储在服务器中来解决,但是不能完全达到负载均衡的效果。Token和Session-Cookie认证方式中的SessionID是不同的,不仅仅是一个标识符。Token一般包含用户的相关信息。通过验证令牌,不仅可以完成身份验证,还可以获得预设信息。客户端可以将令牌存储在容器中,例如localStroage。客户端每次访问都传递token,服务端解密token。服务器不需要存储Session占用存储空间,解决了多台服务器的负载均衡问题。最常用的流程实践是JSONWebToken(JWT),这是目前最流行的跨域认证方案。JWT组成:头部。有效载荷。signatureheader和payload是用base64编码计算的signature:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)'t保存会话状态,因此在使用过程中无法取消令牌或更改令牌的权限。也就是说,JWT一旦发出,在有效期内一直有效。??payload的内容任何人都可以读取,不要把敏感信息放jwt存储位置辩论:我觉得如果存储很多信息自然就防csrf,可以放在localStorage或者sessionStorage。除了JWT可以提高token的安全性,Refreshtoken也可以。业务接口用于身份验证的令牌称为访问令牌。越是权限敏感的业务,越是希望accesstoken的有效期足够短,以免被盗用。但是过短的有效期会导致accesstoken频繁过期。到期后我该怎么办?一种方式是要求用户重新登录获取新的token,这显然不够友好。您必须知道某些访问令牌可能只会在几分钟后过期。另一种方法是有另一个令牌,专门用于生成访问令牌的令牌,我们称之为刷新令牌。refreshtoken的过期时间一般比较长,比如6小时,accesstoken的过期时间比较短,比如10分钟。在我们实际业务中,调用api时只是传递accesstoken进行鉴权。如果访问令牌过期,使用刷新令牌授权服务器更新访问令牌。最终刷新令牌过期,用户必须重新登录。优缺点优点:轻量级,服务器端无存储,移动端可用缺点:一旦派发,一直有效,直到失败(虽然可以解决,但是类似于Session机制)。越来越多的业务系统将分布在不同的域名下,需要具备“一次登录,全线通用”的能力,即所谓的“单点登录”。对于浏览器来说,SSO域下返回的数据应该如何存储,才能在访问A的时候带上呢?这就需要也只有A可以提供在A域下存储凭证的能力。练习OIDCOIDC登录点击,重定向到登录OpenID网站,输入用户名和密码,如果验证成功。它将被重定向到登录回调(先前设置的地址)。回调地址中有一个code参数。验证码无误后,会发出sk。老板系统登录成功。前端通过添加iframe轮询authing链接,实现单点登出关于OIDCOIDC是OAuth2之上的一个简单的身份层协议。它允许客户端对用户进行身份验证并获取基本的用户配置信息。OIDC使用通过符合OAuth2的流程获得的JSONWeb令牌(JWT)返回信息。关于OAuth2OAuth2的最终目标是为第三方应用程序颁发一个时间敏感的令牌令牌。使第三方应用能够通过token获取相关资源。当你想登录一个论坛但没有账号,而这个论坛有QQ、Facebook等登录功能时,QQ登录时使用OAuth2.0协议。客户端请求资源所有者的授权。授权请求可以直接向资源所有者发出,也可以通过授权服务器间接发出。客户获得许可。客户端从授权服务器请求访问令牌。授权服务器验证授权授予并在有效时颁发访问令牌。客户端通过访问令牌向资源服务器请求受保护的资源。资源服务器验证访问令牌并在有效时响应请求。关于LDAPLDAP(LightDirectoryAccessPortocol),中文名称LightweightDirectoryAccessProtocol,是一个开放的、应用广泛的工业标准。比如我们的Jira、Confluence、Yapi。但是LDAP无法实现单点登录SSO。同一用户名和密码只能登录不同的系统,不能一次登录访问多个系统。其他认证方式2FA(two-factorauthentication)在线老板必须开启二次认证,会生成一个二维码。QR码是一个SecretKey。通过CryptoJS.HmacSHA1(默认算法),每次都会计算出一个6位数字。(默认长度)随机数。计算公式为??因为默认30s内有效,所以用户手机时间应该更准确Googleauthenticatorkey二维码http://otpauth//totp/青云QingCloud云计算管理平台:deanchen@yunify.com?secret=xxx&issuer=QingyunQingCloud云计算管理平台xxx:大写字母数字16位base32解码密钥密钥必须大写,不带空格获取Unix时间戳letepoch=Math.round(newDate().getTime()/1000.0);if(localStorage.offset){epoch=epoch+Number(localStorage.offset);}counter=Math.floor(epoch/period);//periodisusually30ThisinvalidationimplementationideaisawesomeComputesignatureconsttime=this.leftpad(this.dec2hex(counter),16,"0");constkey=this.base32tohex(secret)CryptoJS.HmacSHA1(CryptoJS.enc.Hex.parse(time),CryptoJS.enc.Hex.parse(key))得到结果constlen=6;constresult=otp.substr(otp.length-len,len).toString()//默认选择的最后6位作者院长青云科技高级工程师OpenWrite发布!