1。一些概念单点登录:一套公共用户系统,登录后可以访问所有系统。这只是一种解决方案的总称。具体实现上,SAML有两种策略,OAuthOpenID:比如允许使用微信/支付宝等账号登录其他网站只做身份认证,允许你在多个网站登录时使用同一个账号。登录后,站点无法访问您在微信上的数据。Authentication:身份认证,即鉴权(识别是否为合法用户)Authorization:Authorization(访问权限的识别)SMAL2.0:https://zhuanlan.zhihu.com/p/...OAuth:用于authorization,允许被授权方访问被授权方的用户数据https://zhuanlan.zhihu.com/p/...1.token的典型流程:用户登录时,服务端生成一个token(由登录信息进行数字签名,加密后得到的字符串)返回给客户端。客户端后续的请求都会带上这个token。服务器解析token(做解密和签名校验,判断合法性)获取用户信息,响应用户请求。token会有一个过期时间,当客户端注销时token会被丢弃,但服务端不需要任何操作。通过token解析用户身份,服务端也需要定义相应的协议。Session一般使用cookies进行交互。token,可以是cookie,也可以是其他heaser,甚至可以放在请求的内容中。不使用cookies可以带来跨域的便利很多时候sessin和token是可以一起使用的。token技术对应的标准是JWT3。JWT(JSONWebTokens)包括:Header(头)(一个JSON对象){"alg":"HS256",//表示签名算法,默认为HMACSHA256(写成HS256)"typ":"JWT"//表示Token的类型,JWTtoken统一写成JWT}Payload(负载)(也是一个JSON对象——用来存放实际需要传输的数据){//7官方字段"iss":"a.com",//issuer:issuer"exp":"1d",//到期时间:(必须设置)"sub":"test",//subject:subject"aud":"xxx",//audience:audience"nbf":"xxx",//NotBefore:生效时间"iat":"xxx",//IssuedAt:发行时间"jti":"1111",//JWTID:Number//可以定义一个私有字段"name":"JohnDoe","admin":true}Signature(签名)签名前两部分,防止数据被篡改。需要指定密钥(秘密)。使用的公式:header中的签名算法(base64UrlEncode(header)+'.'+base64UrlEncode(payload),secret)JWT=Base64(Header)+"."+Base64(有效载荷)+“。”+$Signature特点:JWT默认是不加密的,任何人都可以读取,所以不要在这部分放机密信息。发送JWT时,使用https。当HTTPS不实用时,不要在JWT中写入秘密数据。令牌在使用过程中不能被撤销,或者令牌的权限是可以改变的,即一经发行,永远有效。使用方法:客户端拿到token后,可以保存在cookie中,或者当localstorage中后续的http请求必须用这个token发送时:可以放在cookie中,也可以放在HTTP请求的Authorization字段中头信息,也可以在post请求时放在请求数据体中。分类:accesstoken:shortvalidityperiod以上都是针对这种tokenrefreshtoken:longvalidityperiod。自我和过期时间存储在服务器的数据库中。只有在申请新的accesstoken后才会进行验证,不会影响业务接口的响应时间,也不会一直保存在内存中处理大量请求。为什么会有刷新令牌?目的:功能分离。refreshtoken负责身份认证,accesstoken负责请求资源。流程:客户端->服务器:用户名&&密码服务器:获取令牌服务器->客户端:访问令牌,刷新令牌客户端:本地保存令牌客户端->服务器:访问令牌服务器:访问令牌未过期服务器->客户端:返回数据客户端->server:accesstokenserver:accesstokenexpiredserver->client:returnerrorclient->server:refreshtokenserver:判断refreshtoken是否过期server->client:notexpired,然后返回新的accesstoken和refreshtoken。如果过期,则需要重新登录4.token和session的区别:session:为无状态的HTTP提供持久化机制。如果需要实现有状态的session,可以在server端添加Session来保存一些状态。仅提供简单的身份验证,数据仅存储在网站上,不应与其他网站或第三方共享APPtoken:它是一种令牌。由于身份认证安全性较好。如果您的用户数据可能需要与第三方共享,或者允许第三方调用API接口,请使用Token。5.bearertoken:定义:用于OAuth2.0授权访问资源。持有承载的任何人都可以访问资源,而无需证明他们持有加密密钥。一个承载代表授权范围、有效期和其他授权事项。转移时,防止泄漏。有效期不能太长。到期后,您可以使用刷新令牌申请续订。资源请求:承载者实现资源请求移动的方式有3种,以下优先级从高到低。AuthorizationHeader:Authorization:BearermF_9.B5f-4.1JqMForm-EncodedBodyParameter:Use:Content-Type:application/x-www-form-urlencodedaccess_token=mF_9.B5f-4.1JqM使用条件:header必须包含“Content-Type:application/x-www-form-urlencoded"entity-body必须遵循application/x-www-form-urlencoded编码(RFC6749)如果entity-body包含access_token以外的其他参数,必须用"&"分隔entity-body只包含ASCII字符要使用request-body中定义的请求方法,不能使用GETURI查询参数:GET/resource?access_token=mF_9.B5f-4.1JqMHTTP/1.1Cache-Control:no-storeserverTheCache-Control:privateWWW-Authenticateheadershouldbeusedintheresponse:当客户端没有发送有效的Bearer时,即发生错误时,资源服务器必须发送WWW-Authenticateheader示例:WWW-Authenticate:Bearerrealm="example",error="invalid_token",error_description="Theaccesstokenexpired"字段用法:Bearer:Beare是一种身份验证类型(基于OAuth2.0),使用关键字“Bearer”定义realm:与Basic和Digest相同,BeareralsoDomaindefinitions同reamlscope:Authorizationscopes,optional,case-sensitive,space-separatedlist(%x21/%x23-5B/%x5D-7E),可以是授权服务器定义的任意值,不应向最终用户显示。OAuth2.0还规定客户端发送scope请求参数指定授权访问范围,当实际授权范围与客户端请求的授权范围不一致时,授权服务器可以发送scope响应参数告知客户端实际授权范围发行令牌的授权范围。下面是两个scope的使用示例:scope="urn:example:channel=HBO&urn:example:rating=G,PG-13"```-错误:描述访问请求被拒绝的原因,字符%x20-21/%Withinx23-5B/%x5D-7E-error_description:为开发者提供可读的解释,在字符%x20-21/%x23-5B/%x5D-7E-error_uri:绝对URI,标识人类可读的页面在字符%x21/%x23-5B/%x5D-7E中解释错误。发生错误时,资源服务器将发送的HTTPStatusCode(通常为400、401、403或405)和ErrorCode如下:-invalid_request:请求缺少参数,或包含无效参数、值、重复参数、多种方法发送的accesstoken、格式错误等。资源服务器将发送HTTP400(BadRequest)-invalid_token:accesstoken过期、撤销、格式错误或其他无效原因。资源服务器会发送HTTP401(Unauthorized),客户端需要申请新的accesstoken才能重新发送资源请求bearertokenresponse:HTTP/1.1200OKContent-Type:application/json;charset=UTF-8Cache-Control:no-storePragma:no-cache{"access_token":"mF_9.B5f-4.1JqM","token_type":"Bearer","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"}```安全威胁:令牌伪造/修改:攻击者伪造/修改现有令牌,导致资源服务器通过非法访问授权客户端。因此,需要对令牌使用数字签名或消息认证码来保证完整性。Token泄露:包含认证、有效期等敏感信息,需要加密。Token重定向:攻击者使用访问资源服务器A的token向资源服务器B请求资源。因此通常token中可以包含代表资源服务器的标识来防止这种情况的发生。令牌重放:攻击者试图使用已用于请求资源的令牌。因此,令牌需要包含有效期(例如,小于1小时)。5.使用token需要考虑的问题如果觉得使用数据库存储token会导致查询时间过长,可以选择内存存储。比如redis就很适合你的token查询需求。令牌完全由应用程序管理,因此可以避免同源策略。令牌可以避免CSRF攻击(因为不需要cookie)。移动端对cookie的支持不是很好,session需要基于cookie实现,所以移动端常用token6。.参考:https://juejin.im/post/5d01f8...http://www.ruanyifeng.com/blo...https://www.cnblogs.com/Xiong...
