OAuth
协议为用户资源的授权提供了一个安全又简易的标准。与以往的授权方式不同之处是 OAuth
的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth
是安全的。OAuth
是 Open Authorization
的简写
OAuth
本身不存在一个标准的实现,后端开发者自己根据实际的需求和标准的规定实现。其步骤一般如下:
token
) 任何身份认证,本质上都是基于对请求方的不信任所产生的。同时,请求方是信任被请求方的,例如用户请求服务时,会信任服务方。所以,身份认证
就是为了解决身份的可信任
问题。
在OAuth2.0
中,简单来说有三方:用户(这里是指属于服务方的用户
)、服务方(如微信、微博等)、第三方应用
code,AppID
等)步骤详解:
Authorization Request
, 第三方请求用户授权Authorization Grant
,用户同意授权后,会从服务方获取一次性用户授权凭据(如code
码)给第三方Authorization Grant
,第三方会把授权凭据以及服务方给它的的身份凭据(如AppId
)一起交给服务方的向认证服务器申请访问令牌Access Token
,认证服务器核对授权凭据等信息,确认无误后,向第三方发送访问令牌Access Token
等信息Access Token
,通过这个Access Token
向Resource Server
索要数据Protected Resource
,资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源 这样服务方,一可以确定第三方得到了用户对此次服务的授权(根据用户授权凭据),二可以确定第三方的身份是可以信任的(根据身份凭据),所以,最终的结果就是,第三方顺利地从服务方获取到了此次所请求的服务
从上面的流程中可以看出,OAuth2.0
完整地解决了用户、服务方、第三方 在某次服务时这三者之间的信任问题
客户端必须得到用户的授权(authorization grant
),才能获得令牌(access token
)。OAuth 2.0
定义了四种授权方式:
authorization code
)implicit
)resource owner password credentials
)client credentials
) 授权码模式(authorization code
)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器与"服务提供商"的认证服务器进行互动。
它的步骤如下:
URI
,同时附上一个授权码URI
,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见URI
,确认无误后,向客户端发送访问令牌(access token
)和更新令牌(refresh token
)等包含以下参数:
如微信授权登录,此ID是APPID
)示例:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
HTTP/1.1 Host: server.example.com
对比网站应用微信登录:请求CODE
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
包含以下参数:
只能使用该码一次
,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。示例:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
包含以下参数:
示例:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
对比网站应用微信登录:通过code获取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
包含以下参数:
示例:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
从上面代码可以看到,相关参数使用JSON格式发送(Content-Type: application/json
)。此外,HTTP头信息中明确指定不得缓存。
对比网站应用微信登录:返回样例
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
如果用户访问的时候,客户端的访问令牌access_token
已经过期,则需要使用更新令牌refresh_token
申请一个新的访问令牌。
客户端发出更新令牌的HTTP请求,包含以下参数:
示例:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
微信刷新Token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
(完)
参考文档一:理解OAuth 2.0 参考文档二:Oauth2.0原理 OAuth 授权的工作原理是怎样的?足够安全吗?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有