2012-05-08 149 views
5

我有一個應用程序將視頻上​​傳到YouTube到特定的YouTube頻道(意味着,不是任何個人用戶的頻道,而是我擁有用戶名和密碼的單個頻道)。從YouTube客戶端登錄遷移到OAuth 2.0

在ClientLogin中,我的服務器端流程爲YouTube提供了U/P,並且提前完成了一切。但是,這已被棄用,我正在升級到OAuth 2.0(根據他們的建議),但是,文檔堅持存在重定向URI,用於用戶登錄時。它似乎不解釋繞過用戶登錄(因爲用戶沒有任何登錄信息,或者任何登錄憑據*,該應用旨在將他們的視頻上傳到我們的頻道)。所以,我需要的是繞過用戶被問到的任何事情,並且讓YouTube簡單地拿走我的頻道憑據,並讓我回傳令牌讓我上傳。

我意識到這是一個完全標準且無爭議的程序,所以我*必須錯過一些明顯的東西,但我不能指出它是什麼。

所以,我的問題是,如何跳過用戶對話框 - >重定向,只需向YouTube提供憑據以便接受然後在OAuth 2.0中上傳我的視頻?

我真正要做的是遵循這裏的DirectUpload方法: https://developers.google.com/youtube/2.0/developers_guide_protocol#AuthSub_Authentication_Flow 而且已經在幕後默默取回了用戶令牌。

TIA

回答

6

實在沒有辦法(我發現)完全繞過訪問外部頁面授權OAuth2.0的訪問。 離我最近的就是在code.google.com/apis/console上創建一個「安裝的應用程序」項目並使用設備方法。 您將收到客戶端ID和客戶端密碼。這些將在稍後使用。 理想情況下,您可以通過code.google.com/apis/youtube/dashboard/

生成一個開發人員密鑰,但我不認爲這是必需的,但我使用JSON表示法爲標題和響應應該很容易適應你選擇的語言。

首先使POST請求與所述首標

{ 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Content-Length': post_data.length, 
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY' 
} 

和包含數據到accounts.google.com/o/oauth2/device/code:

{ 
client_id: 'YOUR_CLIENT_ID', 
scope: 'https://gdata.youtube.com' 
} 

其中YOUR_CLIENT_ID是客戶端您爲之前設置的google apis項目獲得的ID。

你會得到這樣的回答:

{ 
    "device_code" : "4/Pj8m71w5XuEMTT0ZwOJVgvlTfF4Q", 
    "user_code" : "5wtw67wm", 
    "verification_url" : "http://www.google.com/device", 
    "expires_in" : 1800, 
    "interval" : 5 
} 

如果你不訪問每30分鐘(1800秒內www.google.com/device(由「VERIFICATION_URL」字段中定義)的「 expires_in「響應字段),您將不得不再次執行此第一個請求。 在www.google.com/device頁面上,如果您尚未登錄,系統會要求您登錄,然後輸入驗證碼(由「user_code」響應字段定義)。您將看到一個授權應用程序的請求和應用程序請求的權限列表。 您想要(至少暫時)存儲「device_code」字段的值。這將在請求訪問令牌和刷新令牌時使用。

既然權限已被授予,我們可以請求訪問/刷新令牌對。這隻需要在您存儲刷新令牌時發生。 要請求訪問/刷新標記對必須進行POST請求與頭

{ 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Content-Length': post_data.length, 
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY' 
} 

和數據

{ 
    client_id: 'YOUR_CLIENT_ID', 
    client_secret: 'YOUR_CLIENT_SECRET', 
    code: 'YOUR_DEVICE_CODE', 
    grant_type: 'http://oauth.net/grant_type/device/1.0' 
} 

響應將要accounts.google.com/o/oauth2/token像這樣

{ 
    "access_token" : "YOUR_ACCESS_TOKEN", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "YOUR_REFRESH_TOKEN" 
} 

這指定訪問令牌在3600秒(60分鐘)和你目前的訪問令牌是什麼,刷新令牌到期。 您想要存儲用於當前會話的訪問令牌和未來會話的刷新令牌。

在提出API請求時,您需要將訪問令牌包含在授權標頭字段中,幷包含開發者密鑰,就像我們一直以來一樣。 對於上傳視頻,我用這些標題:

{ 
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY', 
    'Slug': 'video.mp4', 
    'Content-Type': 'multipart/related; boundary="f897a6d"', 
    'Content-Length': post_length, 
    'Connection': 'close' 
} 

您可以隨時刷新你的訪問令牌,不只是當舊的到期。要刷新訪問令牌,你做一個POST請求與頭

{ 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Content-Length': post_data.length, 
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY' 
} 

和數據

{ 
    client_id: 'YOUR_CLIENT_ID', 
    client_secret: 'YOUR_CLIENT_SECRET', 
    refresh_token: 'YOUR_REFRESH_TOKEN', 
    grant_type: 'refresh_token' 
} 

到accounts.google.com/o/oauth2/token你會得到這樣的迴應

{ 
    "access_token" : "YOUR_NEW_ACCESS_TOKEN", 
    "token_type" : "Bearer", 
    "expires_in" : 3600 
} 

其中YOUR_NEW_ACCESS_TOKEN是您在未來請求中使用的新令牌。

+0

有沒有辦法將它與.net庫連接起來,例如Video對象? –

相關問題