授权码模式 您所在的位置:网站首页 百度网盘分享未授权 授权码模式

授权码模式

2024-07-13 15:10| 来源: 网络整理| 查看: 265

授权码模式授权

更新时间: 2022-03-22

授权码模式(Authorization Code) 授权时序图 具体授权实现 刷新 Access Token

授权码模式(Authorization Code)

开发者应用在获取用户的授权码 Code 之后,通过 Code 换取 Access Token 凭证。

Access Token 有效期30天,过期后支持刷新,刷新后的 Access Token 有效期仍为 30 天,刷新Access Token请按需刷新,不需要不停的刷新。

刷新请求,如果API返回失败,旧的refresh_token会失效,此时需要重新发起授权请求,获取新的 Access Token、refresh_token,而不是使用旧的 refresh_token 循环再发起刷新请求。

refresh_token 只支持使用一次,refresh_token 使用后失效,下次刷新 Access Token 时需要使用上一次刷新请求响应中的 refresh_token。

获取到的授权码 code 有效期 10 分钟,且仅一次有效。

授权码模式适用于有 Server 端的应用。

授权时序图

image.png

简单介绍时序图的流程,如下:

1.用户选择通过百度账号登录开发者应用。

2.开发者应用发起授权码 Code 请求。

3.百度 OAuth 服务器展示授权页面给用户,用户登录并同意授权。

4.用户同意授权后,百度 OAuth 服务器会将页面跳转至开发者应用配置的回调地址,返回授权码 Code。

5.开发者应用发起 Code 换取 Access Token 请求。

6.百度 OAuth 服务器返回 Access Token 凭证。

具体授权实现

授权码模式实现授权,主要依赖于以下 2 步:

发起授权码 Code 请求,获取用户授权码 Code 换取 Access Token 凭证

1.发起授权码Code请求

(1)发起授权码 Code 请求依赖于以下链接:

GET http://openapi.baidu.com/oauth/2.0/authorize? response_type=code& client_id=您应用的AppKey& redirect_uri=您应用的授权回调地址& scope=basic,netdisk& device_id=您应用的AppID 以上链接示例中参数仅给出了必选参数,其中device_id为硬件应用下的必选参数。 关于应用的相关信息,您可在控制台,点进去您对应的应用,查看应用详情获得。

详细请求参数说明如下:

参数 类型 必选(M)/可选(O) 备注 response_type string M 固定值,值必须为code。表示为授权码模式。 client_id string M 值为您应用的AppKey。 redirect_uri string M 授权后要回调的地址URL。参见回调地址设置。 scope string M 固定值,值必须为basic,netdisk。 device_id string O AppID。注意硬件应用接入时此参数为必选参数。 display string O 授权页面展示样式。参见授权展示方式。 state string O 重定向后会带上state参数。建议开发者利用state参数来防止CSRF攻击。 qrcode int O 让用户通过扫二维码的方式登录百度账号时,可传递 “qrcode=1”。 qrloginfrom string O 此参数在已传 “qrcode=1” 参数时有效,可选值 watch,tv,kindle,speakers 用于对二维码展示样式调整。 qrcodeW int O 此参数在已传 “qrcode=1” 参数时有效,用于设置二维码展示宽度。 qrcodeH int O 此参数在已传 “qrcode=1” 参数时有效,用于设置二维码展示高度。 force_login int O 当需要加载登录页时强制用户输入用户名和密码,不会从 Cookies 中读取百度用户的登录状态,传递 “force_login=1”。

返回说明如下:

发起授权码 Code 请求后,会为用户展示出对应样式的授权页面。

(2)如果用户同意登录并授权,则获取到授权码 Code。关于该授权码 Code,一次有效并在 10 分钟之后过期。

至此,您已经完成了授权实现第一步:拿到 Code。

2.换取AccessToken凭证

通过上述 1 拿到的用户授权码 Code 换取 Access Token 凭证。

换取 Access Token,依赖于以下链接:

GET https://openapi.baidu.com/oauth/2.0/token? grant_type=authorization_code& code=用户授权码 Code 值& client_id=您应用的AppKey& client_secret=您应用的SecretKey& redirect_uri=您应用设置的授权回调地址 以上链接示例中参数仅给出了必选参数。 关于应用的相关信息,您可在控制台,点进去您对应的应用,查看应用详情获得。 请求示例 curl示例 curl -L -X GET 'https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=d5a53cd0ca7799d033399487b23ec992&client_id=EVaI5x0U6lEmP125G0Su55ROEXZtItdD&client_secret=VPgfmrt8UBM5kgkeUemwRVmr5AjhFuEV&redirect_uri=oob' \ -H 'User-Agent: pan.baidu.com' java示例 import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpGetRequestExample { public static void main(String[] args) { try { URL url = new URL("https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=d5a53cd0ca7799d033399487b23ec992&client_id=EVaI5x0U6lEmP125G0Su55ROEXZtItdD&client_secret=VPgfmrt8UBM5kgkeUemwRVmr5AjhFuEV&redirect_uri=oob"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println(response.toString()); } catch (Exception e) { System.out.println(e); } } } python示例 import requests url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=d5a53cd0ca7799d033399487b23ec992&client_id=EVaI5x0U6lEmP125G0Su55ROEXZtItdD&client_secret=VPgfmrt8UBM5kgkeUemwRVmr5AjhFuEV&redirect_uri=oob" payload = {} headers = { 'User-Agent': 'pan.baidu.com' } response = requests.request("GET", url, headers=headers, data = payload) print(response.text.encode('utf8'))

响应示例:

{ expires_in: 2592000, refresh_token: "122.2959fe0da8c91d522099c5dca1b5608f.YDUwKsc1DS89VaP2DogevEN15cD65vXLtZ7bHHe.DbEWAW", access_token: "121.fd4b4277dba7a65a51cf370d0e83f567.Y74pa1cYlIOT_Vdp2xuWOqeasckh1tWtxT9Ouw5.LPOBOA", session_secret: "", session_key: "", scope: "basic netdisk" } 其中可以拿到access_token,另外注意也可以拿到refresh_token、expires_in等值。

详细请求参数说明如下:

参数 类型 必选(M)/可选(O) 备注 grant_type string M 固定值,值必须为authorization_code。 code string M 获取用户授权后拿到的code。 注意code 作为换取Access Token的票据,每次用户授权带上的 code 将不一样,code 只能使用一次,10分钟未被使用自动过期。 client_id string M 您应用的AppKey。 client_secret string M 您应用的SecretKey。 redirect_uri string M 授权回调地址。注意必须与获取授权code传递的保持一致。

返回值说明如下:

参数 类型 备注 access_token string 获取到的Access Token,Access Token是调用网盘开放API访问用户授权资源的凭证。 expires_in int Access Token的有效期,单位为秒。 refresh_token string 用于刷新 Access Token, 有效期为10年。 scope string Access Token 最终的访问权限,即用户的实际授权列表。

至此,恭喜您!您已经拿到了 Access Token,完成了授权。

刷新 Access Token

授权码模式下,Access Token 过期后怎么办?我们支持刷新 Access Token。那么,您如何刷新 Access Token呢。

通过 Refresh Token 刷新,具体依赖于以下链接:

GET https://openapi.baidu.com/oauth/2.0/token? grant_type=refresh_token& refresh_token=Refresh Token的值& client_id=您应用的AppKey& client_secret=您应用的SecretKey 以上链接示例中参数仅给出了必选参数。 关于应用的相关信息,您可在控制台,点进去您对应的应用,查看应用详情获得。 关于 Refresh Token的值,在换取 Access Token 凭证时,您可在响应信息中拿到。 请求示例 curl示例 curl -L -X GET 'https://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token=122.2959fe0da8c91d522099c5dca1b5608f.YDUwKsc1DS89VaP2DogevEN15cD65vXLtZ7bHHe.DbEWAW&client_id=EVaI5x0U6lEmP125G0Su55ROEXZtItdD&client_secret=VPgfmrt8UBM5kgkeUemwRVmr5AjhFuEV' \ -H 'User-Agent: pan.baidu.com' java示例 import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpGetRequestExample { public static void main(String[] args) { try { URL url = new URL("https://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token=122.2959fe0da8c91d522099c5dca1b5608f.YDUwKsc1DS89VaP2DogevEN15cD65vXLtZ7bHHe.DbEWAW&client_id=EVaI5x0U6lEmP125G0Su55ROEXZtItdD&client_secret=VPgfmrt8UBM5kgkeUemwRVmr5AjhFuEV"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println(response.toString()); } catch (Exception e) { System.out.println(e); } } } python示例 import requests url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token=122.2959fe0da8c91d522099c5dca1b5608f.YDUwKsc1DS89VaP2DogevEN15cD65vXLtZ7bHHe.DbEWAW&client_id=EVaI5x0U6lEmP125G0Su55ROEXZtItdD&client_secret=VPgfmrt8UBM5kgkeUemwRVmr5AjhFuEV" payload = {} headers = { 'User-Agent': 'pan.baidu.com' } response = requests.request("GET", url, headers=headers, data = payload) print(response.text.encode('utf8'))

响应示例:

{ expires_in: 2592000, refresh_token: "122.51265f007055bc895cb02c639410a90d.YDLFcE2nee3Cyu-Bsn7SAFVCAfdCkvSm4EnCdkO.Zs_FiQ", access_token: "121.60bf4c9911cb554aac39a1c701a4dae8.YDjwYds0zFgbM1rifQhjMLwsfb6xYus5tUhNEoA.XNNoOQ", session_secret: "", session_key: "", scope: "basic netdisk" }

详细请求参数说明如下:

参数 类型 必选(M)/可选(O) 备注 grant_type string M 固定值,值必须为 refresh_token。 refresh_token string M 固定值,值必须为换取 Access Token时候返回的 refresh_token 值。 client_id string M 您应用的AppKey。 client_secret string M 您应用的SecretKey。

返回值说明如下:

参数 类型 备注 access_token string 获取到的Access Token,Access Token是调用网盘开放API访问用户授权资源的凭证。 expires_in int Access Token的有效期,单位为秒。 refresh_token string 用于刷新Access Token, 有效期为10年。 scope string Access Token 最终的访问权限,即用户的实际授权列表。

至此您就实现了刷新 Access Token。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有