1

因此,我已經做了一些雲端點在應用程序中使用,並且正在通過在Android客戶端中保護它們的過程。每次我嘗試並使用android客戶端代碼中的數據時,都會收到錯誤401「Unautorized Access」。我可以告訴爲什麼異常被拋出,因爲我沒有檢查每個API方法的'用戶'參數。但我的問題是爲什麼我總是得到我的API方法的空用戶。我已成功爲我的端點構建器提供了正確的憑據,並使用手機上的帳戶爲setSelectedAccountName。這裏是我的例子:雲終端返回錯誤401未經授權的請求

一種API方法:

public CollectionResponse<Student> getAllStudents(User user) throws OAuthRequestException { 
     if (user == null) 
       throw new OAuthRequestException("BAD_USER"); 
     else { 
       List<Student> stud = ofy().load().type(Student.class).list(); 
       return CollectionResponse.<Student>builder().setItems(stud).build(); 
      } 
    } 

這個被放置在API的頂部還有:

@Api(name = "studentEndpoint", version = "v1", namespace = @ApiNamespace(ownerDomain = "appbackend.mymodule.example.com", ownerName = "appbackend.mymodule.example.com", packagePath=""), 
      scopes = {Constants.EMAIL}, 
      clientIds = {Constants.WEB_CLIENT_ID, Constants.ANDROID_CLIENT_ID}, 
      audiences = {Constants.ANDROID_AUDIENCE}) 

我使用的客戶經理抓住帳戶的電子郵件我Android客戶端,設置憑據並獲取訪問令牌。

GoogleAccountCredential cred = GoogleAccountCredential.usingAudience(AddUser.this, AppConstants.AUDIENCE); 
       cred.setSelectedAccountName(emailAccount); 

我這是怎麼在我的客戶端代碼中使用:

StudentEndpoint service = AppConstants.getApiHandle(cred); 
       stud = service.getAllStudents().execute(); 

上面的代碼被異步調用。

我有三重檢查了我的客戶ID以確保他們是正確的,他們是。我也通過adb將它從android studio直接安裝到我的手機上。我在谷歌雲控制檯中有我的調試SHA1,但是我是否也需要我的發行版SHA1。我不認爲我會,因爲我還沒有爲這個應用程序創建釋放鍵,並且只使用了未簽名的副本。以及如果我使用Web客戶端,我可以進行身份​​驗證,但每次我提出請求時,都會收到錯誤401,並且我看到我的例外情況'BAD_USER'被拋出。我有一個'承載者'鍵,顯示我有權訪問。

如果我取消了模塊中用戶參數的空檢查,這些方法工作正常,我可以從我的數據存儲中獲取數據。那麼,爲什麼我每次使用api請求都得到空用戶呢?任何幫助深表感謝。提前致謝。

回答

1

我會建議重新考慮以下3點:

  • 確保您的包名是正確的,即在這兩個Android應用程序,並且是創造在雲的憑據時指定的軟件包名稱相同安慰。

  • 你能檢查代碼中AppConstants.AUDIENCE的值嗎?理想情況下,需要在以下格式「服務器:CLIENT_ID:WEB_CLIENT_ID」

  • 確保您Constants.WEB_CLIENT_ID相同Constants.ANDROID_AUDIENCE

+0

謝謝,我覺得愚蠢沒有注意到這一點,但我有我的Constants.ANDROID_AUDIENCE =「WEB_CLIENT_ID」而不是= WEB_CLIENT_ID ....這使得它在Android設備上工作,但我仍然在Web客戶端中出現錯誤401 – 2014-09-04 16:15:18

相關問題