一键授权登录
OAuth 2.0模式
OAuth 2.0模式是第三方授权登录的常用模式
以acwing为例:
Client指自己网站的用户,Client发请求指用户点击第三方登录按钮;Web指自己网站的前后端;
第一步 申请授权码code
请求地址:https://www.acwing.com/third_party/api/oauth2/web/authorize/
参考示例:
请求方法:GET
https://www.acwing.com/third_party/api/oauth2/web/authorize/?appid=APPID&redirect_uri=REDIRECT_URI&scope=SCOPE&state=STATE
参数说明
state 否 用于判断请求和回调的一致性,授权成功后后原样返回。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数(如果是将第三方授权登录绑定到现有账号上,那么推荐用随机数 + user_id作为state的值,可以有效防止CSRF攻击)
返回说明
用户同意授权后会重定向到redirect_uri,返回参数为code和state。链接格式如下:
redirect_uri?code=CODE&state=STATE
如果用户拒绝授权,则不会发生重定向。
第二步 申请授权令牌access_token和用户的openid
请求地址:https://www.acwing.com/third_party/api/oauth2/access_token/
参考示例:
请求方法:GET
https://www.acwing.com/third_party/api/oauth2/access_token/?appid=APPID&secret=APPSECRET&code=CODE
参数说明
返回说明
申请成功示例:
{ "access_token": "ACCESS_TOKEN", "expires_in": 7200, "refresh_token": "REFRESH_TOKEN","openid": "OPENID", "scope": "SCOPE",
}
申请失败示例:
{"errcode": 40001,"errmsg": "code expired", # 授权码过期
}
返回参数说明
参数 说明
access_token 授权令牌,有效期2小时
expires_in 授权令牌还有多久过期,单位(秒)
refresh_token 用于刷新access_token的令牌,有效期30天
openid 用户的id。每个AcWing用户在每个acapp中授权的openid是唯一的,可用于识别用户。
scope 用户授权的范围。目前范围为userinfo,包括用户名、头像
刷新access_token的有效期
access_token的有效期为2小时,时间较短。refresh_token的有效期为30天,可用于刷新access_token。刷新结果有两种:
如果access_token已过期,则生成一个新的access_token。
如果access_token未过期,则将当前的access_token的有效期延长为2小时。
参考示例:
请求方法:GET
https://www.acwing.com/third_party/api/oauth2/refresh_token/?appid=APPID&refresh_token=REFRESH_TOKEN
返回结果的格式与申请access_token相同。
第三步 申请用户信息
请求地址:https://www.acwing.com/third_party/api/meta/identity/getinfo/
参考示例:
请求方法:GET
https://www.acwing.com/third_party/api/meta/identity/getinfo/?access_token=ACCESS_TOKEN&openid=OPENID
参数说明
参数 是否必须 说明
access_token 是 第二步中获取的授权令牌
openid 是 第二步中获取的用户openid
返回说明
申请成功示例:
{'username': "USERNAME",'photo': "https:cdn.acwing.com/xxxxx"
}
申请失败示例:
{'errcode': "40004",'errmsg': "access_token expired" # 授权令牌过期
}