2016-12-27 71 views
6

以下是我的工作流程,用於爲youtube API獲取訪問令牌和刷新令牌。 IM產生授權的URL與參數YOUTO oAuth每次提出請求時都會提示授權窗口

ACCESS_TYPE =離線,RESPONSE_TYPE =代碼,REDIRECT_URI = URI,範圍=範圍,狀態=狀態,CLIENT_ID = ID

從授權URL I'm接收認證碼,然後I'm生成另一URL獲得的access_token和使用代碼從與這些參數

代碼授權URL refresh_token:代碼,CLIENT_ID:CLIENT_ID,client_secret:cLIENT_SECRET,REDIRECT_URI:serviceCallback,狀態:state.callback,grant_typ e:「authorization_code」

據我所知用戶應該只完成一次該過程,然後它應該是自動的。我的問題是,我總是需要完成授權,並且我總是獲得新的access_token和refresh_token,而不會根據請求強制它。

這裏是I'm得到驗證網址

getAuthUrl: function(scopes, applicationCallback, serviceCallback, siteId, 
selectChannel, websiteUrl) { 
var requestedClientId = CLIENT_ID; 
var scopess = 
    "https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/youtube.readonly https://www.googleapis.com/auth/userinfo.email " + 
    scopes.replace(",", " "); 

return "https://accounts.google.com/o/oauth2/auth?" + 
    "access_type=offline" + 
    "&response_type=code" + 
    /*"&approval_prompt=auto" +*/ 
    "&redirect_uri=" + serviceCallback + 
    "&scope=" + scopes + 
    "&state=" + JSON.stringify({ 
    service: NAME, 
    callback: applicationCallback, 
    scopes: scopes, 
    siteId: siteId, 
    selectChannel: selectChannel, 
    websiteUrl: websiteUrl 
    }) + 
    "&client_id=" + requestedClientId; 
    }, 

從那裏即時得到回代碼並使用該代碼,clientID的和clientSecret獲得訪問令牌和刷新代碼部分令牌

getAuthTokens: function(code, state, res, serviceCallback) { 
// Google oAuth endpoint 
var endpoint = "https://www.googleapis.com/oauth2/v4/token"; 
const scopes = state.scopes.split(" "); 
// Setup request data 
var data = { 
    code: code, 
    client_id: CLIENT_ID, 
    client_secret: CLIENT_SECRET, 
    redirect_uri: serviceCallback, 
    state: state.callback, 
    grant_type: "authorization_code" 
}; 


request.post(endpoint).send(data).type('form').set('Accept', 
     'application/json').end(function(err, oAuthResponse) {}); 
    }, 

我使用了錯誤的端點url我將它改爲了youtube api文檔提供的不同的one-to-one,並從數據變量中刪除了狀態參數,但仍不能解決問題

新端點URL

var endpoint = "https://accounts.google.com/o/oauth2/token"; 

I'm真的,因爲現在我可不是強制許可,並在谷歌Apps部分,這正是我已經授權的應用程序,它不會更新授權,這意味着它授予權限只有第一個困惑時間和之後,當我按下允許它不會做任何事情。 OAuth應該檢查是否有刷新令牌,所以我的結論是,我不完全瞭解它應該如何工作,或者我在某種程度上以自動強制授權提示的調試或測試模式測試所有內容。

我會非常感謝任何形式的幫助,因爲我覺得我嘗試了一切。

+0

您需要自行發佈代碼。您應該只在代碼中提示用戶身份驗證一次。一旦你有了一個刷新令牌,你就可以在你喜歡請求一個新的訪問令牌時使用它。您的問題可能與您在不需要時始終請求訪問用戶的事實有關。 – DaImTo

回答

5

問題是您使用的access token在您下次使用之前已過期未使用refresh token手動更新access token

如果[(上次更新訪問令牌的時間)+(到期時間)]已經超過,則需要使用refresh token更新access token

刷新令牌的概念是,如果一個訪問令牌受到損害,因爲它是短暫的,攻擊者具有其中它可以用於在有限的時間段。 刷新令牌如果受到攻擊是無用的,因爲除了刷新令牌外,攻擊者還需要客戶端ID客戶端密鑰以獲取訪問令牌。

通過YouTube API文檔演示程序here

默認情況下,到期時間大約爲3秒。

這一定會適用於您的情況。

-1

去谷歌的我的帳戶設置爲這個帳戶--->去連接的應用程序和網站---->管理應用程序: 在那裏,你可以看到這樣YouTube的權限:enter image description here

+0

這甚至不嘗試解決這個問題。 – DaImTo

+0

嗯,它可能,因爲這是所有的權限是存在的谷歌應用程序或任何第三方應用程序的地方。如果此處不存在權限,則必須添加該權限,以免重複請求權限。 – Anik

+0

它增加了我需要的所有權限並且不會從那裏消失 – kosas