OAuth的解释
就是对第三方应用的授权机制,使其获取用户的数据
数据所有者收到第三方请求授权后,告诉系统通过第三方应用的请求,系统就会自动生成一个令牌(token),用来替代密码,供第三方应用使用。
令牌的特点
是短期有效的。因为获取了令牌就相当于获取了密码,所以需要保证安全性,用户也不能进行更改。
令牌可以被数据所有者撤销,立即失效。
令牌是有权限范围的,并不是获取了令牌就可以代替密码使用。
而数据所有者向第三方应用颁发令牌有四种方式,无论哪种方式,客户端申请权限之前,都必须到系统备案,说明自己的身份,然后会获取两个身份识别码:客户端ID(client ID)和客户端密钥(client password)
第一种授权方式:识别码
第三方应用先申请一个授权码,再通过授权码请求令牌。这种方式安全性最高,适用于有后端的Web应用。授权码通过前端发送,而令牌储存在后端,而且所有与资源服务器的通信都在后端完成。
第一步:A网站提供一个链接,用户点击后就会跳转到B网站。此时A网站的请求参数有response_type=code,表示以要求返回授权码。client_id用来向网站B标明身份,redirect_url表示网站B接收或拒绝后跳转的页面,scope表示授权范围
第二步:用户跳转后,B网站会要求用户登录,然后询问是否同意给A网站授权,同意后会跳转到指定的地址,并带上授权码
第三步:A网站拿到授权码后,就可以在后端,向B网站请求令牌 参数中的client_id和client_secret用来标明身份,grant_type值为AUTHORIZATION_CODE,表示请求授权的是授权码,code为授权码,redirect_url是返回令牌跳转的地址
第四步:B网站接受请求后,就会颁发令牌,方法就是向返回的URL上发送json格式的数据。其中aceess_token就是令牌
第二种授权方式:隐藏式
有的应用没有后端,就只能将令牌储存在前端
第一步:网站A提供一个链接,要求用户跳转到网站B,授权令牌给网站A使用。参数中response_type为token,表示直接返回令牌,redirect_url表示同意后的跳转地址
第二步:网站B接受请求,跳转到之前指定的URL,并在参数中带上令牌。
注意:令牌是URL的锚点而不是查询字符串,不会发送到服务器,减小泄露的可能
第三种授权方式:密码式
如果高度信任某应用,可以将用户名和密码直接告诉该应用,该应用通过其请求令牌
第一步:A网站要求用户提供B网站的用户名和密码,直接通过用户名和密码请求令牌。参数中grant_type为password,表示为密码式,username和password分别是B 的用户名和密码。
第二步:B网站验证身份通过后,直接将令牌当做json数据,放在http响应中返回
第四种方式:凭证式
适用于没有前端的命令行应用,
第一步:A应用在命令行上向B网站发送请求。参数中grant_type为client_credentials
表示采用凭证式,client_id和client_secret用来标明身份
第二步:B网站验证身份后向A应用返回令牌
这种方式给出的令牌是针对应用的,而不是某个用户,因此可能有多个用户使用该令牌