活动地址:CSDN21天学习挑战赛
开放授权(Open Authorization OAuth) 是一种资源提供商用于授权第三方应用代表资源所有者获取有限访问权限的授权机制。由于在整个授权过程中,第三方应用都无法触及用户的密码就可以获取部分资源的使用权限,所以OAuth是开放安全的。
OAuth第一个版本诞生于2007年12月,由于OAuth1.0复杂的签名逻辑以及单一的授权流程存在较大缺陷,随后推出了OAuth2.0,OAuth2.0放弃了OAuth1.0中让开发者感到痛苦的数字签名和加密方案,后面我们要讲的都是指OAuth2.01。
对于OAuth,其实大家并不陌生,比如登录百度账户的时候,下面会提供QQ、新浪微博、微信的登录。当使用QQ登录的时候,会跳转到一个QQ OAuth2.0的登录窗口,登录QQ后再跳转回百度,并登录百度,从而避免在第三方网站提交QQ密码,在QQ登录窗口,右侧显示了第三方网站能够获取的权限资源,只能获取昵称、头像、性别。
从QQ授权登录机制中,我们基本可以看到OAuth认证的流程和形式。
OAuth的4个重要角色:
如图3描述了4种角色的交互流程
在这个流程中,第二步OAuth定义了4种授权模式,用于将用户的授权许可提供给客户端。
授权码模式是功能最完整、流程最严密的授权模式,它将用户引导到授权服务器进行身份验证,授权服务器将发放的访问令牌传递给客户端。百度使用QQ账户登录就是使用的该模式,如下。
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100312028&response_type=code&redirect_uri=https%3A%2F%2Fpassport.baidu.com%2Fphoenix%2Faccount%2Fafterauth%3Fmkey%3D7a58056f35517b863aca5dd7add6a179c927361ed5803d1ff8%26tpl%3Dmn&state=1659803324&display=page&scope=get_user_info%2Cadd_share%2Cget_other_info%2Cget_fanslist%2Cget_idollist%2Cadd_idol%2Cget_simple_userinfo&traceid=
其中,response_type指授权类型,必须,固定为code client_id指客户端id,必须 state指客户端的状态,通常在授权服务器重定向时原样返回 scope为申请的权限范围,如获取用户信息、获取用户相册等,由授权服务器抽象为具体的条目 redirect_uri为授权通过后的重定向URL,授权服务器将在用户登录完成之后重定向到该地址。
隐式授权模式的客户端一般指用户浏览器。访问令牌通过重定向的方式传递到用户浏览器中,再通过浏览器的JavaScript代码来获取访问令牌。由于访问令牌直接暴露在浏览器端,所以隐式授权模式可能会导致范围令牌被泄露,仅适用于需要临时访问的场景。 与授权码模式相比,用户的登录环节是一样的,只是在授权成功之后的重定向,授权码模式是携带一个认证码,由客户端通过认证码申请访问令牌,而隐式授权模式则直接将访问令牌作为URL参数传递给浏览器。 隐式授权模式在重定向时携带的参数有: access_token:访问令牌 expire_in:访问令牌多少秒后过期 state:客户端的状态参数
客户端携带用户的密码向授权服务器申请令牌,这种操作不再像前两种一样跳转到授权服务器进行,而是由客户端提供专用页面。
客户端授权模式通常由客户端提前向授权服务器申请公钥、秘钥,并通过这些关键信息向授权服务器申请访问令牌,从而得到资源服务器提供的资源。
关于OAuth2的定义和运行流程先讲到这里,下篇将在Spring Security中使用OAuth2。