人人OAuth 2.0文檔

人人OAuth 2.0文檔已經升級,老文檔請瀏覽 老Auhentication文檔

人人開放平臺使用OAuth 2.0作爲驗證與授權協議。我們支持一系列OAuth 2.0驗證授權流程,支持網站站內應用手機客戶端桌面客戶端。本文檔概述瞭如何使用各種人人OAuth 2.0的各種驗證授權流程,樣例代碼使用PHP作爲服務端編程語言,HTML/JavaScript作爲客戶端編程語言。樣例代碼非常直觀,也可以很容易的翻譯成其他編程語言。

目錄

[隱藏]

[編輯] 用戶登錄

人人開放平臺支持3種不同的OAuth 2.0驗證與授權流程:

  • 服務端流程(協議中Authorization Code Flow)。此流程適用於在Web服務端調用REST API的的應用。例如:網站站內應用
  • 客戶端流程(協議中Implicit Flow)。注意:此流程適用於在客戶端調用REST API的應用。例如:後端無Web Server支持的手機客戶端桌面客戶端,運行於瀏覽器內部的JavaScript、ActionScript應用(瀏覽器插件、純Flash應用)。
  • 用戶名密碼流程(協議中Resource Owner Password Credentials Flow)。此流程適用於無法使用瀏覽器發起服務端和客戶端驗流程的應用。

無論你使用那個流程,人人OAuth 2.0都會涉及到了三個步驟:

  • 用戶驗證:確保用戶是誰;
  • 應用授權:確保用戶知道他授予什麼樣的數據和權限給您的應用;
  • 應用驗證:確保用戶授予權限的應用是您的應用,而不是其他應用。

當完成這些步驟後,您的應用可以獲得一個用戶的Access Token。使這個Access Token,您的應用可以獲取這個用戶的信息,並可以以這個用戶的身份做出相應的動作(髮狀態、上傳照片)。

[編輯] 服務端流程

登錄流程開始於重定向用戶瀏覽器(如果需要的話,可以彈出窗口或打開新頁面)到人人OAuth 2.0的Authorize Endpoint,並傳遞三個必須參數

  • client_id:必須參數。在開發者中心註冊應用時獲得的API Key。
  • redirect_uri:流程結束後要跳轉回得URL。redirect_uri所在的域名必須在開發者中心註冊應用後,填寫在編輯屬性選項卡中填寫到服務器域名中,人人OAuth2.0用以檢查跳轉的合法性。關於redirect_uri的驗證方式的詳細信息請參考 redirect_uri驗證配置
  • response_type:必須參數。服務端流程,此值固定爲“code”。
https://graph.renren.com/oauth/authorize? client_id=YOUR_API_KEY&redirect_uri=YOUR_CALLBACK_URL&response_type=code

如果用戶已經登錄,人人OAuth 2.0會校驗存儲在用戶瀏覽器中的Cookie。如果用戶沒有登錄,人人OAuth 2.0會爲用戶展示登錄頁面,讓用戶輸入用戶名和密碼:

Image:oauth_login.png

當人人OAuth 2.0成功驗證用戶之後,會爲用戶展示授權頁面,讓用戶爲應用授權:

Image:oauth_auth.png

默認情況下,會要求用戶授予用於訪問基本信息的權限,例如用戶公共信息、好友關係等。如果應用需要的權限超過基本信息權限,就需要要求用戶授予深層次的權限。這個過程是通過添加人人OAuth 2.0 'scope'請求參數實現的:

  • scope:非必須參數。以空格分隔的權限列表,若不傳遞此參數,代表請求用戶的默認權限。全部權限請參考'權限列表'

下面的例子展示瞭如何要求用戶授予訪問用戶的相冊新鮮事的權限:

https://graph.renren.com/oauth/authorize? client_id=YOUR_API_KEY&redirect_uri=YOUR_CALLBACK_URL&response_type=code&scope=read_user_album+read_user_feed

注意:上述scope參數中的'+',是空格(' ')的URL Encode編碼。

Image:oauth_auth_ext.png

如果用戶不同意授權(點擊關閉),應用將不會被授權。人人OAuth2.0會將用戶的瀏覽器重定向(通過HTTP 302)到redirect_uri參數對應的URL上,並在Query中帶上相應的錯誤信息。

http://YOUR_CALBACK_URL?error=nvalid_request& &error_description=The+request+is+missing+a+required+parameter:+client_id.

如果用戶同意授權(點擊連接),應用將會被授權。人人OAuth2.0會將用戶的瀏覽器重定向(通過HTTP 302)到redirect_uri參數對應的URL上,並在Query中使用'code'參數返回一個Authorization Code。

http://YOUR_CALBACK_URL?code=A_CODE_GENERATED_BY_SERVER

Authorize Code可以在redirect_uri後端程序中獲得(例如:Java request.getParameter("code");)。獲得到Authorization Code後,你可以進行流程的下一步—應用驗證,以便獲得可以調用REST API的Access Token。

應用驗證需要使用HTTP POST請求人人OAuth 2.0的Access Token Endpoint,並需要帶上一系列需要的參數:

注意:人人OAuth2.0支持多種傳遞“client_id”和“client_secret”的方式,包括:URI Query Parameter、Form-Encoded Body Parameter和RFC2617定義的HTTP Basic Authentication,詳細信息請瀏覽Client Authenticated

https://graph.renren.com/oauth/token?grant_type=authorization_code& client_id=YOUR_API_KEY&redirect_uri=YOUR_CALLBACK_URL& client_secret=YOUR_SECRET_KEY&code=THE_CODE_FROM_ABOVE

如果應用驗證通過(client_id與client_secret匹配,redirect_uri與獲取Authorization Code時傳遞的redirect_uri保持一致),並且從用戶獲取的Authorization Code也正確,人人OAuth 2.0會返回Access Token相關的信息:

{ "access_token": "10000|5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506", "expires_in": 87063, "refresh_token": "10000|0.385d55f8615fdfd9edb7c4b5ebdc3e39-222209506", "scope": "read_user_album read_user_feed"}
  • access_token:獲取的Access Token;
  • expires_in:Access Token的有效期,以秒爲單位;
  • refresh_token:用於刷新Access Token 的 Refresh Token,長期有效,不會過期;
  • scope:Access Token最終的訪問範圍,既用戶實際授予的權限列表(用戶在授權頁面時,有可能會取消掉某些請求的權限)。關於權限的具體信息請參考權限列表

如果應用驗證過程中出錯,人人OAuth 2.0將返回HTTP 401(應用驗證失敗)或HTTP 400(參數錯誤),並在HTTP Body中返回錯誤信息:

{ "error": "invalid_request", "error_description": "The request is missing a required parameter: client_id"}
  • error:錯誤碼,有關錯誤碼的詳細信息請瀏覽錯誤碼
  • error_description:一段人類可讀的文字,用來幫助理解和解決發生的錯誤;
  • error_uri:一個人類可讀的網頁URI,帶有關於錯誤的信息,用來爲終端用戶提供與錯誤有關的額外信息。

下圖展示了服務端流程HTTP請求的全過程:

Image:server_side_flow.png

下面的PHP示例代碼簡要展示了服務端流程,並考慮了CSRF攻擊的防範工作:

<?php $app_id = "YOUR_API_KEY"; $app_secret = "YOUR_APP_SECRET"; $my_url = "YOUR_CALLBACK_URL"; session_start(); $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "http://graph.renren.com/oauth/authorize?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $token_url = "https://graph.renren.com/oauth/token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = @file_get_contents($token_url); $params = null; parse_str($response, $params); $graph_url = "https://api.renren.com/v2/user?access_token=" . $params['access_token']; $user = json_decode(file_get_contents($graph_url)); echo("Hello " . $user->name); } else { echo("The state does not match. You may be a victim of CSRF."); } ?>

[編輯] 客戶端流程

客戶端流程同樣使用人人OAuth 2.0的Authorize Endpoint來實現用戶驗證和應用驗證。唯一不同點是需要指定'response_type'參數爲'token':

https://graph.renren.com/oauth/authorize? client_id=YOUR_API_KEY&redirect_uri=YOUR_CALLBACK_URL&response_type=token

與服務端流程一樣,可以使用'scope'參數來請求深層次權限,實現應用授權:

https://graph.renren.com/oauth/authorize? client_id=YOUR_API_KEY&redirect_uri=YOUR_CALLBACK_URL&scope=email,read_stream& response_type=token

與服務端流程一樣,當用戶驗證和應用授權通過後,人人OAuth2.0會將用戶的瀏覽器重定向(通過HTTP 302)到redirect_uri參數對應的URL上。與服務端流程不同的是,客戶端流程不會返回code參數,而是在URI Fragment中返回Access Token(#access_token=...):

http://YOUR_CALLBACK_URL#access_token=1000%7C5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506&expires_in=64090

由於返回的Access Token是在URI Fragment中返回,只有客戶端代碼(例如:例如運行與瀏覽器中的JavaScript、有瀏覽器控件支持的客戶端代碼)纔可以獲取Access Token。

應用驗證是通過驗證'redirect_uri'實現的,關於redirect_uri的驗證方式的詳細信息請參考 redirect_uri驗證配置

下圖展示了客戶端流程HTTP請求的全過程:

Image:client_side_flow.png

下面的HTML/JavaScript示例代碼簡要展示了客戶端流程:

<html> <head> <title>Client Flow Example</title> </head> <body> <script> function displayUser(user) { var userName = document.getElementById('userName'); var greetingText = document.createTextNode('Greetings, ' + user.name + '.'); userName.appendChild(greetingText); } var appID = "YOUR_API_KEY"; if (window.location.hash.length == 0) { var path = 'https://graph.renren.com/oauth/authorize?'; var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token']; var query = queryParams.join('&'); var url = path + query; window.open(url); } else { var accessToken = window.location.hash.substring(1); var path = "https://api.renren.com/v2/user?"; var queryParams = [accessToken, 'callback=displayUser']; var query = queryParams.join('&'); var url = path + query; // use jsonp to call the rest api var script = document.createElement('script'); script.src = url; document.body.appendChild(script); } </script> <p id="userName"></p> </body> </html>

[編輯] 用戶名密碼端流程

注意:使用用戶名密碼端流程的權限需要提前申請,有關申請細節參見 申請Resource Owner Password Credentials Access Grant

用戶名密碼流程需要使用HTTP POST請求人人OAuth 2.0的Access Token Endpoint,並需要帶上一系列需要的參數:

  • grant_type:使用Resource Owner Password Credentials作爲Access Grant時,此值爲“password”。
  • username:人人網用戶的用戶名;
  • password:人人網用戶的密碼;
  • client_id:在開發者中心註冊應用時獲得的API Key;
  • client_secret:在開發者中心註冊應用時獲得的Secret Key。此值不要嵌入到任何要發佈到服務端以外的代碼裏(這種場景應該使用客戶端流程);
  • scope:非必須參數。以空格分隔的權限列表,若不傳遞此參數,代表請求用戶的默認權限。全部權限請參考'權限列表'

注意:人人OAuth2.0支持多種傳遞“client_id”和“client_secret”的方式,包括:URI Query Parameter、Form-Encoded Body Parameter和RFC2617定義的HTTP Basic Authentication,詳細信息請瀏覽Client Authenticated

請求如下:

https://graph.renren.com/oauth/token?
    grant_type=password&
    username=USERNAME&
    password=PASSWORD&
    client_id=YOUR_API_KEY&
    client_secret=YOUR_SECRET_KEY&
    scope=...

如果用戶驗證通過(用戶名密碼正確),並且應用驗證通過,人人OAuth 2.0會返回Access Token相關的信息:

{ "access_token": "10000|5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506", "expires_in": 87063, "refresh_token": "10000|0.385d55f8615fdfd9edb7c4b5ebdc3e39-222209506", "scope": "read_user_album read_user_feed"}
  • access_token:獲取的Access Token;
  • expires_in:Access Token的有效期,以秒爲單位;
  • refresh_token:用於刷新Access Token 的 Refresh Token,長期有效,不會過期;
  • scope:Access Token最終的訪問範圍,既用戶實際授予的權限列表(用戶在授權頁面時,有可能會取消掉某些請求的權限)。關於權限的具體信息請參考權限列表

[編輯] 使用Access Token

獲得Access Token後,可以Access Token調用REST API。詳細信息請瀏覽REST API以及使用Access Token調用REST API

[編輯] 刷新Access Token

Access Token生命週期較短,在某些場景下,應用需求的Access Token的生命期超過一個Access Token的生命期,就可以使用Refresh Token來刷新Access Token,Refresh Token是一個不過期的Token。

刷新Access Token需要使用HTTP POST請求人人OAuth 2.0的Access Token Endpoint,並需要帶上一系列需要的參數:

  • grant_type:使用Refresh Token刷新Access Token時,此值爲“refresh_token”。
  • refresh_token:獲取Access Token時,同時下發的Refresh Token
  • client_id:在開發者中心註冊應用時獲得的API Key;
  • client_secret:在開發者中心註冊應用時獲得的Secret Key。此值不要嵌入到任何要發佈到服務端以外的代碼裏(這種場景應該使用客戶端流程);

注意:人人OAuth2.0支持多種傳遞“client_id”和“client_secret”的方式,包括:URI Query Parameter、Form-Encoded Body Parameter和RFC2617定義的HTTP Basic Authentication,詳細信息請瀏覽Client Authenticated

請求如下:

https://graph.renren.com/oauth/token? grant_type=refresh_token& refresh_token=...& client_id=...& client_secret=...

如果應用驗證通過,並且Refresh Token也正確,人人OAuth 2.0會返回Access Token相關的信息:

{ "access_token": "10000|5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506", "expires_in": 87063, "refresh_token": "10000|0.385d55f8615fdfd9edb7c4b5ebdc3e39-222209506", "scope": "read_user_album read_user_feed"}
  • access_token:獲取的Access Token;
  • expires_in:Access Token的有效期,以秒爲單位;
  • refresh_token:用於刷新Access Token 的 Refresh Token,長期有效,不會過期;
  • scope:Access Token最終的訪問範圍,既用戶實際授予的權限列表(用戶在授權頁面時,有可能會取消掉某些請求的權限)。關於權限的具體信息請參考權限列表

[編輯] 公共主頁登錄

每一個公共主頁都有若干個管理員,只有公共主頁的管理員授予應用'admin_page'權限,應用才能以管理員的身份管理公共主頁(髮狀態、上傳照片等):

https://graph.renren.com/oauth/authorize? client_id=YOUR_API_KEY&redirect_uri=YOUR_CALLBACK_URL&scope=admin_page& response_type=token

管理員授予應用權限後,應用可以使用管理員的Access Token調用公共主頁類API

[編輯] 應用類型

人人網開放平臺提供了上述的OAuth 2.0驗證與授權流程以支持不同類型的應用,包括:網站站內應用手機客戶端桌面客戶端

[編輯] 網站

網站接入開發攻略詳細介紹瞭如何使用OAuth 2.0在網站上實現登錄和賬號綁定。

[編輯] 站內應用

站內應用開發攻略詳細介紹瞭如何使用OAuth 2.0開發彈層授權,以及集成應用到人人網的開發經驗。

[編輯] 手機客戶端

手機客戶端開發攻略詳細介紹瞭如何使用OAuth 2.0在手機上實現登錄和賬號綁定,同時也介紹了在手機上實現單點登錄的SSO API的使用。

[編輯] 桌面客戶端

由於OAuth 2.0協議定義的桌面客戶端的授權流程,用戶體驗方面過於複雜,所以桌面客戶端應用可以在應用中嵌入瀏覽器控件(很多框架都支持嵌入瀏覽器,例如:.NET、AIR、Cocoa等)使用客戶端流程。

由於大部分桌面客戶端軟件是沒有後端沒有Web服務器支持,沒辦法提供一個'redirect_uri',所以人人網爲沒有Web服務器的客戶端應用提供了一個通用的URL:http://graph.renren.com/oauth/login_success.html。

流程如下:

  • 在應用中嵌入一個瀏覽器控件,並使用客戶端流程定向控件到人人OAuth 2.0 Authorize Endpoint(https://graph.renren.com/oauth/authorize):
https://graph.renren.com/oauth/authorize? client_id=YOUR_API_KEY& redirect_uri=http://graph.renren.com/oauth/login_success.html
  • 經過用戶驗證、應用授權,人人OAuth 2.0將把瀏覽器控件定向導'redirect_uri'(http://graph.renren.com/oauth/login_success.html),並在URI Fragment中追加Access Token:
http://graph.renren.com/oauth/login_success.html#access_token=...
  • 當應用發現瀏覽器的控件的URL跳轉到這個URL上時,從URL中解析出Access Token。

[編輯] 安全考慮

[編輯] 跨站請求僞造 (CSRF)

CSRF通過僞裝來自受信任用戶的請求來利用受信任的網站。爲了防止CSRF攻擊,在請求人人OAuth 2.0 Authorize Endpoint的時候,需要使用state傳遞一個用戶的唯一標示,這個標示在調轉到rediret_uri時會被原樣返回。人人網強烈推薦使用這種方式來保持用於的狀態,防止CSRF攻擊。

[編輯] Redirect_URI

應用指定的'redirect_uri'不要返回HTTP 302,既不要跳轉。詳細信息請參考OAuth 2.0協議第十章第十五節



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章