OAuth2 快速入门( 二 )
- 安全断言标记语言:SAML
- JSON WEB TOKEN:JWT
POST /token HTTP/1.1Host: as.example.comContent-Type: application/x-www-form-urlencodedAuthorization: Basic b2F1dGgtY2xpZW50LTE6b2F1dGgtY2xpZW50LXNlY3JldC0xgrant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer --tt-darkmode-color: #FFFFFF;">3.5 资源拥有者许可凭证(不推荐使用)如果资源拥有者在授权服务器上有纯文本的用户名和密码 , 那么客户端可以向用户索取用户的凭据 , 然后用这个凭据换取令牌,也叫作密码流程 。 资源拥有者与之直接交互的是客户端 , 而不是授权服务器 。 这种许可类型只使用令牌端点 , 并且只通过后端信道通信 。
文章插图
3.6 授权许可类型如何选择
文章插图
4 OAuth 安全相关4.1 CSRF攻击授权码许可和隐式许可类型中都可以使用的state 参数 , 这个参数是一个随机数 , 作为接口请求参数 。 客户端使用state参数来维持请求与回调之间状态的不透明值 。 授权服务器在将用户代理重定向回客户端时包含该值 。 应该使用这个参数 , 它可以防止CSRF(cross-site request forgery , 跨站请求伪造) 。 后续有实际例子 。
4.2 授权服务器安全- 授权码使用一次之后将其销毁 。
- 授权服务器应该采用精确匹配的重定向URI 校验算法 , 这是唯一安全的方法 。
- 完全按照OAuth 核心规范来实现授权服务器可能会导致它成为一个开放重定向器 。 如果这个重定向器能受到妥善的监控 , 则情况还好 , 但稍有不慎则会面临风险 。
- 留意在进行错误提示的过程中 , 信息有可能通过URI 片段或者Referrer 头部遭泄露 。
4.3 授权码安全授权码可以避免将令牌直接暴露给其他人 , 但是授权码仍可能白劫持 。 授权码本身是没有用的 , 特别是客户端拥有用于自身身份认证的密钥的情况下 。 然而 , 原生应用在客户端密钥方面存在特殊问题(APP可能需要把密钥写死在源代码中导致泄露);解决办法:PKCE(Proof Key for Code Exchange)(1)客户端创建并记录名为code_verifier的秘密信息(2)客户端根据code_verifier计算code_challenge(例如:密码散列MAC)(3)客户端请求授权服务器 , 并附带code_challenge以及code_challenge_method(计算方法 , 可选);(4)授权服务器正常响应 , 并记录code_challenge和code_challenge_method(与授权码关联);(5)客户端接收到授权码后 , 携带之前生成的code_verifier , 执行令牌申请请求;(6)授权服务器计算code_challenge , 检测是否一致 。
文章插图
5 OAuth 令牌OAuth 系统中的客户端无须了解令牌本身的任何信息 。 客户端需要知道的就是如何从授权服务器获取令牌以及如何在资源服务器上使用令牌 。 但是 , 授权服务器和资源服务器需要了解令牌的内容 。 授权服务器要知道如何生成令牌来颁发给客户端 , 资源服务器要知道如何识别并验证客户端发送过来的令牌 。
- OAuth 令牌可以具有有效期 , 可以支持撤回 , 也可以永久有效 , 或者根据情况将这些特性组合;
- 令牌可以代表特定的用户或者系统中所有的用户 , 也可以不代表任何用户;
- 令牌可以具有内部结构 , 可以是随机的无意义字符串 , 也可以被加密保护 , 甚至可以将这几项结合起来 。
- 授权服务器生成令牌之后 , 会将令牌值存储在磁盘上的共享数据库中(非必须) 。 当受保护资源从客户端收到令牌之后 , 它会在同一个数据库中查找令牌值 , 以确定令牌有效 。 这种令牌不携带任何信息 , 只是充当数据库查询的检索值 。
5.1 结构化令牌:JWT可参考内容:JSON Web Tokens - jwt.io
- 优势:不向共享数据库查询 , 将所有必要的信息放在令牌内部 , 授权服务器可以通过令牌本身间接地与受保护资源沟通 , 而不需要调用任何网络API 。
- 劣势:颁发的令牌无法撤回 。
5.1.1 JWT结构JWT 的核心是将一个JSON 对象封装为一种用于网络传输的格式 。 整体机构通过句点分割 , 每个部分是由Base64URL编码的JSON对象 , 通过三个部分组成:
- 头部(head):声明签名算法 , 以及负载类型
- 负载(payload):用户数据
- 签名(signature):对前两部分的签名
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- GB|备货充足要多少有多少,5000mAh+128GB,红米新机首销快速现货
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 能力|美国研发快速法评估神经网络的不确定性 改进自动驾驶车决策能力
- 入门|做抖音影视赚钱比工资多,教大家新手也可快速入门
- 开发人员|ER(实体关系)建模入门指引
- DDR5内存曝光:16GB 4800MHz快速更省电
- 快速概览 + 详细了解N:N聚类算法是如何应用的
- 喵喵机错题打印机P1:随时打印,随时学习,快速整理错题
- 零基础小白Python入门必看:通俗易懂,搞定深浅拷贝
- 快速安装一个OpenShift 4 准生产集群