2012-02-17 84 views
4

我發現我可以通過OAuth 2.0,當我重定向URI是認證爲「urn:IETF:WG:OAuth的:2.0:OOB」,但用戶被迫複製代碼,然後返回一個活動並將其粘貼到一個字段中。我希望體驗比這更優雅。當重定向URI爲「http:// localhost」的,(即使是返回的接入代碼)我無法換取一個訪問令牌API。這裏是我的交易所代碼:的Oauth 2不能爲接入令牌交換代碼,返回「invalid_grant」

  ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
        0); 
      nameValuePairs.add(new BasicNameValuePair("client_id", 
        OAuth2ClientCredentialsMark1.CLIENT_ID)); 
      nameValuePairs.add(new BasicNameValuePair("client_secret", 
        OAuth2ClientCredentialsMark1.CLIENT_SECRET)); 
      nameValuePairs.add(new BasicNameValuePair("code", accessCode)); 
      nameValuePairs.add(new BasicNameValuePair("grant_type", 
        "authorization_code")); 
      nameValuePairs.add(new BasicNameValuePair("redirect_uri", 
        OAuth2ClientCredentialsMark1.REDIRECT_URI)); 
        //"http://localhost" 

      String url = "https://accounts.google.com/o/oauth2/token"; 
      //url += URLEncodedUtils.format(nameValuePairs, "utf-8"); 

      Log.d("print", url); 
      HttpPost hPost = new HttpPost(
        url); 
      hPost.setHeader("content-type", "application/x-www-form-urlencoded"); 

      hPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

該代碼總是返回{ 「錯誤」: 「invalid_grant」}是什麼給了?

我的應用程序是基於樣本@https://github.com/ddewaele/LatitudeOAuth2Sample的,我一直在關注本教程@http://code.google.com/apis/accounts/docs/OAuth2InstalledApp.html

+0

我有同樣的問題。使用Scala而不是Java,但除此之外它是相同的。我使用http:// localhost:9000作爲重定向URI。 – Magnus 2012-03-07 16:23:15

+0

我在安裝的應用程序上面臨OAuth的相同問題。你有沒有解決這個問題?請給出意見。 – Khushboo 2013-02-05 11:28:24

回答

3

看來,你的代碼是正確的。錯誤來自OAuth2 spec section-5.2

所提供的授權許可(例如授權碼,資源所有者證書)或刷新令牌無效,已過期,撤銷,不匹配URI的授權請求中使用,或發出給另一客戶端的重定向。

很可能,您的應用程序尚未得到用戶的授權。


爲了回答您的問題有關:

用戶被強制複製代碼,然後返回一個活動,並將其粘貼到現場

你能澄清什麼樣的oauth2 flow (scenario),你在發展嗎?

0
{ 
    "access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74" 
} 

當您第一次嘗試爲您的應用程序獲取access_token時,您會獲得以上信息。並且在訪問令牌過期一小時後,您可以使用refresh_token獲取新的access_token ....這裏是您的鏈接https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token

1

如以下線程所示,它可能是TIMING錯誤。確保你的服務器是與世界時鐘同步可能只是防止invalid_grant錯誤完全。

我對我的只有一臺服務器那樣的問題,而事實上,它是唯一一個40秒的出場世界時鐘(這是在未來)。我以前ntpdate強行更改日期,並安裝了ntp服務。這是一個Linux機器。

https://groups.google.com/forum/?fromgroups=#!topic/google-analytics-data-export-api/4uNaJtquxCs

相關問題