2017-04-09 196 views
0

我使用谷歌https://developers.google.com/identity/sign-in/web/server-side-flow下面的例子到目前爲止,我能夠實現以下步驟:在客戶端越來越TokenResponseException:401未經授權

  1. 用戶認證(瀏覽器)
  2. 代碼被返回和保存在服務器上db
  3. 請求驗證碼時TokenResponseException:401未經授權。

我檢查以下內容:

  1. API啓用
  2. https://developers.google.com/oauthplayground我測試了相同的客戶端ID和客戶端密鑰接入和它的作品
  3. 閱讀幾乎每一個SO查詢,這是與這個問題有關,但他們都沒有真正幫助。
  4. 試圖撤銷所有用戶權限並重新要求他們獲取新代碼。

下面是我使用的代碼:

public void getUserAuthTokens(String authCode){ 
    try { 

     GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
       JacksonFactory.getDefaultInstance(),new FileReader(new ClassPathResource("static\\client_secret.json").getFile())); 

     List<String> scopes = new ArrayList<>(); 
     scopes.add("https://www.googleapis.com/auth/gmail.readonly"); 
     //String scopes[]={"https://www.googleapis.com/auth/gmail.readonly"}; 

     Collection<String> SCOPES 
       = Collections.unmodifiableCollection(
       Arrays.asList(
         new String[]{ 
           GmailScopes.GMAIL_READONLY 
         })); 
     GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(),JacksonFactory.getDefaultInstance(), 
       "https://www.googleapis.com/oauth2/v4/token", 
       clientSecrets.getDetails().getClientId(), 
       clientSecrets.getDetails().getClientSecret(), 
       authCode).setRedirectUri(clientSecrets.getDetails().getRedirectUris().get(0)).setScopes(SCOPES).execute(); 


     String accessToken = tokenResponse.getAccessToken(); 
     System.out.print("Token is: "+accessToken); 
    }catch (IOException x){ 
     x.printStackTrace(); 

    } 

} 

一個側面說明,如果我沒有使用setRedirectUri(。clientSecrets.getDetails()getRedirectUris()獲取(0)),然後,我就「重定向失配誤差」

我將不勝感激對此有何想法,我從Standard Error Responses,谷歌的API返回,錯誤代碼401未授權基於跑出

+0

夥計們我真的需要一些幫助在這裏我無法破解這個 – user2145673

回答

0

經過大量的調試和搜索,我發現了一個可行的解決方案,我在這裏發佈這個帖子,以防有人遇到同樣的問題。

這裏是我使用的代碼:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(),JacksonFactory.getDefaultInstance(), 
       "https://www.googleapis.com/oauth2/v4/token", 
       clientSecrets.getDetails().getClientId(), 
       clientSecrets.getDetails().getClientSecret(), 
       authCode, "postmessage") 
       .execute(); 

你可以閱讀更多的PostMessage的@Google+ Sign-in for server-side apps, exchanging auth code for access token

希望有所幫助。

0

指示與授權CRE問題爲請求提供的dentials。您可能需要查看以下可能的原因:

  • OAuth訪問令牌已過期,需要刷新。這可以通過儘早刷新訪問令牌來避免,但代碼也可以捕獲此錯誤,刷新令牌並自動重試。
  • 提供了多個不匹配的授權;只選擇一種模式。
  • OAuth訪問令牌的綁定項目不匹配與提供的開發人員密鑰關聯的項目。
  • 授權標頭爲無法識別的格式或使用不受支持的憑證類型。

有關使用OAuth 2.0訪問Google API的更多信息,請參閱此documentation。建議的解決方案在這個相關的SO post也可能有所幫助。

+0

嗯,我在代碼發送到谷歌的階段,以獲得訪問令牌,並在那裏失敗。你可以看到上面的相關代碼。該錯誤被捕獲塊捕獲,我可以看到堆棧跟蹤中的錯誤。任何想法可能導致什麼? – user2145673

相關問題