NO IMAGE

最近網盤大戰中,百度網盤將空間升級到了永久1TB,鑑於百度的實力用做資料備份空間不錯,不過百度網盤沒有Linux下的客戶端,上傳管理檔案需通過百度開放雲平臺訪問PCS資源的系列介面。
    1.首先加入百度開發者:http://developer.baidu.com/dev#/create
    2.任意建立一個應用獲取API Key並開通PCS API許可權,開放API > API管理 > API列表 > API服務 > PCS API > 開啟
    3.通過剛剛新建應用的API Key獲取device code和user_code 

curl -k -L -d “client_id=<api_id>&response_type=device_code&scope=basic,netdisk” \
“https://openapi.baidu.com/oauth/2.0/device/code”
  

4.在瀏覽器開啟https://openapi.baidu.com/device輸入獲取到的user_code並連線,然後通過device code獲取refresh_token和access_token: 

curl -k -L -d “grant_type=device_token&code=<code>&client_id=<api_id>&client_secret=<api_secret>” \
“https://openapi.baidu.com/oauth/2.0/token” 

5.此時通過access_token就可對網盤檔案進行操作了,獲取到access_token的有效期為30天,過期後通過refresh_token重新獲取access_token
curl -k -L -d “grant_type=refresh_token&refresh_token=<refresh_token>&client_id=\
<api_id>&client_secret=<api_secret>” 

獲取網盤配額: 

curl -k -L “https://pcs.baidu.com/rest/2.0/pcs/quota?method=\
info&access_token=<access_token>”
  

上傳檔案:

curl -k -L -F “[email protected]” “https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&\
access_token=<access_token>&path=/apps/pcsupload/test.tar.gz”

下載檔案: 
curl -k -O “https://d.pcs.baidu.com/rest/2.0/pcs/file?method=download&access_token=<access_token>&\
path=/apps/pcsupload/test.tar.gz”
  

刪除檔案: 

curl -k -L “https://pcs.baidu.com/rest/2.0/pcs/file?method=delete&access_token=<access_token>\
&path=/apps/pcsupload/test.tar.gz”  

複製檔案: 

curl -k -L “https://c.pcs.baidu.com/rest/2.0/pcs/file?method=copy&access_token=<access_token>\
&from=/apps/pcsupload/test.tar.gz&to=/apps/pcsupload/test2.tar.gz”
  

列出目錄內檔案:

curl -k -L “https://pcs.baidu.com/rest/2.0/pcs/file?method=list&access_token=<access_token>\
&path=/apps/pcsupload/”

  

更多操作請參考百度官方資料:http://developer.baidu.com/wiki/index.php?title=docs/pcs/rest/file_data_apis_list

授權應用場景

開發者需要根據各自的應用場景,選擇適用的OAuth2.0授權流程: 

  • 網站或者站外Web應用,請參考:Authorization Code流程; 
  • 桌面和無線客戶端應用,請參考:Authorization Code流程,無server端的也可以使用Implicit Grant流程,無線客戶端可以直接使用官方SDK,通過WebView方式使用授權頁;
  • 針對雲平臺的API授權,只是針對開發者,參考:百度OAuth2.0對外提供的開發者授權方式Developer Credentials。

以下介紹了三種應用場景方便開發者熟悉授權流程。

Server端使用百度OAuth2.0授權呼叫開放API流程

Authorization
Code
又稱Web Server Flow,適用於所有有Server端配合的應用。有效期一個月的Access Token 有效期十年的Refresh Token。

(A) get code <= http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=TG3X5KahFVkmik87Rf46gLMU&redirect_uri=oob&scope=netdisk%20basic&display=page

(B) get access code <= https://openapi.baidu.com/oauth/2.0/token?client_id=TG3X5KahFVkmik87Rf46gLMU&client_secret=F9WIzAVVvEjVP9nuQV1AaoO8NpgIi5UA&grant_type=authorization_code&code=7d4dd5aef9f6b36adfc8556b51cc1d93&redirect_uri=oob

1. 引導使用者到如下地址進行授權:

http://openapi.baidu.com/oauth/2.0/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REGISTERED_REDIRECT_URI&
scope=email&
display=popup

2. 如果使用者同意授權,頁面跳轉至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE 。
3. 換取Access Token。

https://openapi.baidu.com/oauth/2.0/token?
grant_type=authorization_code&
code=CODE&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET&
redirect_uri=YOUR_REGISTERED_REDIRECT_URI

返回值

{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
"scope": "basic email",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}

4. 使用獲得的OAuth2.0 Access Token呼叫API 

移動端使用百度OAuth2.0授權呼叫開放API流程

Implicit
Grant
又稱User-Agent Flow,適用於所有無Server端配合的應用(桌面客戶端需要內嵌瀏覽器)。有效期一個月的Access Token。
https://openapi.baidu.com/oauth/2.0/authorize?response_type=token&client_id=TG3X5KahFVkmik87Rf46gLMU&redirect_uri=oob&scope=netdisk&display=page

1. 引導使用者到如下地址進行授權:

http://openapi.baidu.com/oauth/2.0/authorize?
response_type=token&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REGISTERED_REDIRECT_URI&
scope=email&
display=popup&
state=xxx

2. 如果使用者同意授權,頁面跳轉至 YOUR_REGISTERED_REDIRECT_URI 在Fragment中追加如下引數。

YOUR_REGISTERED_REDIRECT_URI#access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328&expires_in=86400&scope=basic%20email&session_key=ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn&session_secret=248APxvxjCZ0VEC43EYrvxqaK4oZExMB&state=xxx

3. 截獲OAuth2.0 Access Token呼叫API。 

裝置使用百度OAuth2.0授權呼叫開放API流程

Device適用於一些輸入受限的裝置上(如只有數碼液晶顯示屏的印表機、電視機等)。有效期一個月的Access Token 有效期十年的Refresh Token。

(A) get user_code <= curl -k -L -d “client_id=TG3X5KahFVkmik87Rf46gLMU&response_type=device_code&scope=basic,netdisk” “https://openapi.baidu.com/oauth/2.0/device/code”

(B) get access code <= http://openapi.baidu.com/device?code=itpj3wd9&display=page&redirect_uri=&force_login=

1. 獲取User Code和Device Code :

  https://openapi.baidu.com/oauth/2.0/device/code?
client_id=YOUR_CLIENT_ID&
response_type=device_code& 
scope=basic,netdisk

2. 授權服務會返回一段JSON文字,其中包含一個二維碼圖片地址。

{
"device_code":"a82hjs723h72h3a82hjs723h72h3vb",
"user_code":"8sjiae3p", 
"verification_url":"https:\/\/openapi.baidu.com\/oauth\/2\.0\/device", 
"qrcode_url":"http:\/\/openapi.baidu.com\/device\/qrcode\/6c6a8afee394f99e55eb25858\/2c885vjk",
"expires_in":1800, 
"interval":5
}

3. 引導使用者通過其他終端去百度填寫User Code並授權。 

 使用者可使用手持智慧終端掃描上一步中的二維碼圖片(qrcode_url欄位) ,或者在瀏覽器中直接訪問裝置展現的授權網址https://openapi.baidu.com/device

4.通過Device Code獲取Access Token。

https://openapi.baidu.com/oauth/2.0/token?
grant_type=device_token&
code=Device Code&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET

5. 使用獲得的OAuth2.0 Access Token呼叫API。 

獲取Access Token

總體介紹

OAuth2.0(開放授權)是一個開放標準,使用者授權後,第三方應用無需獲取使用者的使用者名稱和密碼就可以訪問該使用者在某一網站上儲存的私密的資源(如照片,視訊,聯絡人列表)。

Access Token:使用者身份驗證和授權的憑證。第三方應用在呼叫百度開放API之前,首先需要獲取Access Token。

目前,百度OAuth2.0支援五種獲取Access Token的流程和一種重新整理獲取AccessToken方式,第三方可根據需求選取合適的方式:

百度授權的Access Token是有有效期的,這樣會影響使用者的體驗和增加開發者的工作。所以平臺提供了一種方式可以保證授權有效期為永久。

  • 實現方式:返回給第三方一個月有效期的Access Token 十年有效期的Refresh Token。
  • 實現原理:Refresh Token的作用就是在Token有效期截止前,重新整理以獲取新的Access Token。
獲取途徑 授權流程 介紹 有效期
新獲取Authorization
Code
又稱Web Server Flow,適用於所有有Server端配合的應用。有效期一個月的Access Token 有效期十年的Refresh Token。
Implicit
Grant
又稱User-Agent Flow,適用於所有無Server端配合的應用(桌面客戶端需要內嵌瀏覽器)。有效期一個月的Access Token。
Client
Credentials
即採用應用公鑰、金鑰獲取Access Token,適用於任何帶server型別應用。 
通過此授權方式獲取Access Token僅可訪問平臺授權類的介面。
有效期一個月的Access Token 有效期十年的Refresh Token。
Device適用於一些輸入受限的裝置上(如只有數碼液晶顯示屏的印表機、電視機等)。有效期一個月的Access Token 有效期十年的Refresh Token。
重新整理Refresh
Token
Access Token重新整理方式,適用於所有有Server端配合的應用 。十年重新整理期限。

Client Credentials授權

簡介

        採用Client Credentials方式,即應用公鑰、金鑰方式獲取Access Token,適用於任何型別應用,但通過它所獲取的Access Token只能用於訪問與使用者無關的Open API,並且需要開發者提前向百度開放平臺申請,成功對接後方能使用。其流程示意圖如下:

oauth%2Fclient_credentials.gif

        對於應用而言,其流程只有一步,即直接獲取Access Token。

獲取Access Token

請求資料包格式

        使用Client Credentials獲取Access Token需要應用在其服務端傳送請求(推薦用POST方法)到百度OAuth2.0授權服務的“https://openapi.baidu.com/oauth/2.0/token”地址上,並帶上以下引數:

  • grant_type:必須引數,固定為“client_credentials”;
  • client_id:必須引數,應用的API Key;
  • client_secret:必須引數,應用的Secret Key;
  • scope:非必須引數。以空格分隔的許可權列表,採用本方式獲取Access Token時只能申請跟使用者資料無關的資料訪問許可權。關於許可權的具體資訊請參考“許可權列表”。

        例如:

https://openapi.baidu.com/oauth/2.0/token?
grant_type=client_credentials&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&

響應資料包格式

響應資料包格式

        若引數無誤,伺服器將返回一段JSON文字,包含以下引數:

  • access_token:要獲取的Access Token;
  • expires_in:Access Token的有效期,以秒為單位;請參考“Access
    Token生命週期
  • refresh_token:用於重新整理Access Token 的 Refresh Token,所有應用都會返回該引數;(10年的有效期
  • scope:Access Token最終的訪問範圍,即使用者實際授予的許可權列表(使用者在授權頁面時,有可能會取消掉某些請求的許可權),關於許可權的具體資訊參考“許可權列表”一節;
  • session_key:基於http呼叫Open API時所需要的Session Key,其有效期與Access Token一致;
  • session_secret:基於http呼叫Open API時計算引數簽名用的簽名金鑰。

        例如:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
 
{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
"scope": "public",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}

        若請求錯誤,伺服器將返回一段JSON文字,包含以下引數:

  • error:錯誤碼;關於錯誤碼的詳細資訊請參考“百度OAuth2.0錯誤響應”。
  • error_description:錯誤描述資訊,用來幫助理解和解決發生的錯誤。

例如:

HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
 
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}

開發者需要注意的事項

  • 預設情況下,Access Token的有效期為一個月,如果Access Token過期可以重新獲取。
  • 獲取Access Token時所返回的session_key和session_secret引數不是OAuth2.0協議標準規定的返回引數,而是百度OAuth2.0服務擴充套件加入的,目的是使得開發者可以基於http呼叫百度的Open API,因為基於https呼叫Open API雖然更為簡單,但畢竟響應速度更差(比基於http的要差一倍時間左右)。

Refresh Token

簡介

        對於從百度開放平臺申請到允許永久授權許可權的應用,無論其採用Authorization Code、Reource Owner Password Credentials、Client Credentials中的哪一個去獲取Access Token,都會拿到一個有效期為個月的Access Token和有效期為10年的Refresh Token對於這些應用,只要使用者在10年內登陸應用,應用就可以使用Refresh
Token重新整理以獲得新的Access Token(新的Refresh Token也會同時下發),從而達到只要使用者不連續10年未登陸過你的應用就不需要重新登陸的目的。

獲取Access Token

請求資料包格式

        使用Refresh Token重新整理以獲得新的Access Token,需要應用在其服務端傳送請求(推薦用POST方法)到百度OAuth2.0授權服務的“https://openapi.baidu.com/oauth/2.0/token”地址上,並帶上以下引數:

  • grant_type:必須引數,固定為“refresh_token”;
  • refresh_token:必須引數,用於重新整理Access Token用的Refresh Token;
  • client_id:必須引數,應用的API Key;
  • client_secret:必須引數,應用的Secret Key;
  • scope:非必須引數。以空格分隔的許可權列表,若不傳遞此引數,代表請求的資料訪問操作許可權與上次獲取Access Token時一致。通過Refresh Token重新整理Access Token時所要求的scope許可權範圍必須小於等於上次獲取Access Token時授予的許可權範圍。關於許可權的具體資訊請參考“許可權列表”。

        例如:

https://openapi.baidu.com/oauth/2.0/token?
grant_type=refresh_token&
refresh_token=2.e8b7dbabc28f731035f771b8d15063f23.5184000.1292922000-2346678-124328&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
scope=email

響應資料包格式

        若引數無誤,伺服器將返回一段JSON文字,包含以下引數:

  • access_token:要獲取的Access Token;
  • expires_in:Access Token的有效期,以秒為單位;請參考“Access
    Token生命週期
  • refresh_token:用於重新整理Access Token 的 Refresh Token,並不是所有應用都會返回該引數;(10年的有效期)
  • scope:Access Token最終的訪問範圍,即使用者實際授予的許可權列表(使用者在授權頁面時,有可能會取消掉某些請求的許可權),關於許可權的具體資訊參考“許可權列表”;
  • session_key:基於http呼叫Open API時所需要的Session Key,其有效期與Access Token一致;
  • session_secret:基於http呼叫Open API時計算引數簽名用的簽名金鑰。

        例如:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
 
{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.af3d55f8615fdfd9edb7c4b5ebdc3e32.604800.1293440400-2346678-124328",
"scope": "basic email",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}

        若請求錯誤,伺服器將返回一段JSON文字,包含以下引數:

  • error:錯誤碼;關於錯誤碼的詳細資訊請參考“百度OAuth2.0錯誤響應”一節。
  • error_description:錯誤描述資訊,用來幫助理解和解決發生的錯誤。

        例如:

HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
 
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}

許可權列表

使用者授權相關的許可權描述
basic使用者基本許可權,可以獲取使用者的基本資訊
super_msg往使用者的百度首頁上傳送訊息提醒,相關API任何應用都能使用,但要想將訊息提醒在百度首頁顯示,需要第三方在註冊應用時額外填寫相關資訊
netdisk獲取使用者在個人雲端儲存中存放的資料
平臺授權相關的許可權描述
public可以訪問公共的Open API
hao123可以訪問Hao123 提供的Open API介面

該許可權需要申請開通,請將具體的理由和用途發郵件給[email protected]

        每一個Access Token代表“一個使用者”或“百度開放平臺”授予“一個應用”的“一系列資料訪問操作許可權”。這“一系列資料訪問操作許可權”中包含預設訪問許可權,以及在獲取Access Token過程中傳遞的“scope”引數所表示的擴充套件許可權。在呼叫API時,百度Open API服務會檢驗請求中的Access Token或Session Key是否包含本API需要的許可權。

        應用在請求獲取Access Token時所傳遞的“scope”引數中可以不包含basic許可權(即預設許可權),一旦使用者或平臺同意授權,則basic許可權會自動授予。百度目前開放的Open API還為數不多,目前唯一定義的擴充套件許可權就super_msg訪問許可權,應用需要這個許可權時需要在獲取Access Token時指定scope=super_msg,如:

https://openapi.baidu.com/oauth/2.0/authorize?
response_type=code&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect&
scope=super_msg&
display=popup

獲取Access Token示例

下面操作步驟以Android SDK為例介紹如何在您的應用程式中獲取Access Token。

1. 開發者預先配置好Android開發環境。
請參考http://developer.android.com/index.html
請您下載Android SDK:BaiduPCS_SDK_Android_2.0.zip

2. 從下載包中的BaiduPCS_SDK_Android_2.0\lib目錄中得到所有的Jar包:

Baidu_OAuth_SDK_Android_G-2.0.0.0.jar
Baidu_PCS_SDK_Android-2.0.0.0.jar
httpmime-4.2.jar

3. 在Eclipse建立一個Android應用程式。

4. 修改AndroidManifest.xml,增加以下許可權:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>//Android4.2作業系統需要此許可權,其它版本系統無限制。

5. 修改layout/main.xml,向其中新增button widget:

<Button
android:id="@ id/getAccessToken"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="62dp"
android:text="Get Access Token" />

6. 進入專案libs目錄,然後將下載的包中的PcsAndroidDemo/libs中的Baidu_OAuth_SDK_Android_G-2.0.0.0.jar包拷貝到此libs目錄,然後並將其加入Android程式的Build Path中。

pcs_100.jpg

7. 修改工程中預設的MainActivity.java。
1) Import 庫

importcom.baidu.oauth.BaiduOAuth;
importcom.baidu.oauth.BaiduOAuth.BaiduOAuthResponse;
importcom.baidu.oauth.BaiduOAuth.OAuthListener;
importandroid.widget.Button;
importandroid.widget.Toast;
importandroid.view.View;
importandroid.view.View.OnClickListener;

2) 設定使用者API key

private final String mbApiKey = "BbekPBG0sgL4CDUWfBrF0mFv";//請替換申請客戶端應用時獲取的Api Key串

3) 新增按鈕響應事件。

private Button getAccessToken;//新增響應按鈕
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getAccessToken = (Button) this.findViewById(R.id.getAccessToken);//響應按鈕類
getAccessToken.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
BaiduOAuthoauthClient = new BaiduOAuth();
oauthClient.startOAuth(MainActivity.this, mbApiKey, new String[]{"basic"},new BaiduOAuth.OAuthListener() {
@Override
public void onException(String msg) {
Toast.makeText(getApplicationContext(), "Login failed "   msg, Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete(BaiduOAuthResponse response) {
if(null != response){
String accessToken = response.getAccessToken();
Toast.makeText(getApplicationContext(), "Token: "   accessToken   "    User name:"   response.getUserName(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancel() {
Toast.makeText(getApplicationContext(), "Login cancelled", Toast.LENGTH_SHORT).show();
}
});
}
});
}

8. 執行Android程式,登入並進行授權:

pcs_101.jpg

輸入已有的百度使用者名稱和密碼,單擊登入。

注意:

右上方藍色字型“pcstest_oauth”是使用者申請第三方應用時指定的應用名(和上面替換的API key有對應關係)。

如果使用者第一次登入第三方應用,會出現授權頁面,使用者需要單擊“授權”:

pcs_102.jpg

9. 授權成功後,在Android模擬器toast訊息框裡面我們就能看見獲取的access token資訊和使用者名稱。使用此Access Token,第三方開發者就可以使用PCS API了。

pcs_103.jpg