2013-03-07 21 views
4

我有我的第一次使用在調試模式下認證的谷歌雲端點Android應用嘗試麻煩。我設置了憑據是這樣的:雲端點認證失敗的Android應用

credential = GoogleAccountCredential.usingAudience(this, 
      "server:client_id:long-string-i-got-from-api-console"); 
credential.setSelectedAccountName(accountName); 

然後嘗試使用這樣的:

final String LOCAL_APP_ENGINE_SERVER_URL = "http://xxx.xxx.x.xxx:8888"; 
Testdbendpoint.Builder endpointBuilder = new Testdbendpoint.Builder(
      AndroidHttp.newCompatibleTransport(), 
      new GsonFactory(), 
      credential); 
endpointBuilder.setRootUrl(LOCAL_APP_ENGINE_SERVER_URL + "/_ah/api/"); 
Testdbendpoint endpoint = endpointBuilder.build(); 
try { 
    TestDB testDB = new TestDB().setId(10101L);      
    TestDB result = endpoint.insertTestDB(testDB).execute(); //-- fails here!!!! 
} catch ... 

但嘗試失敗,我在logcat中獲取這些信息:

03-06 23:33:20.418:W/System.err的(11861): com.google.android.gms.auth.GoogleAuthException:致未知03-06 23:33:20.418:W/System.err的(11861) :在 com.google.android.gms。 auth.GoogleAuthUtil.getToken(Unknown Source) 03-06 23:33:20.423:W/System.err(11861):at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 03- 06 23:33:20.428:W/System.err的(11861):在 com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192)

+0

您正在使用物理設備而不是仿真器,對嗎? – 2013-03-07 07:20:36

+0

@Dan Holevoet,是 – aez 2013-03-07 12:13:14

回答

12

也許你有你的Android客戶端識別錯誤的證書指紋(SHA1)?僅當您手動簽署.apk時,使用生產密鑰的指紋才能進行驗證。

註冊一個客戶端ID針對已安裝應用(Android版)與debug.keystore指紋您API Console。要獲取指紋的使用:

C:\>keytool -list -alias androiddebugkey -keystore C:\.android\debug.keystore -storepass android -keypass android 

您也需要一個Web客戶端-ID,並在你的Android應用程序設置爲聽衆:

credential = GoogleAccountCredential.usingAudience(this,"server:client_id:" + WEB_CLIENT_ID); 

AppEngine上的端點配置應該是這樣的:

@Api(
    name = "testEndpoint", 
    version = "v1", 
    clientIds = {ClientIds.WEB_ID, ClientIds.ANDROID_PRODUCTION_ID, ClientIds.ANDROID_DEBUG_ID}, 
    audiences = {ClientIds.WEB_ID} 

+0

我從API控制檯中刪除了客戶端ID,我無法使用正確的軟件包名稱創建新的Android客戶端ID。您能幫助我嗎? @Nipper – 2014-05-22 19:55:44

0

只是確保,但你登記在谷歌API控制檯以及App Engine應用程序ID的客戶ID?該谷歌帳戶已添加到設備?

在這個博客上的說明可能是有用的:
http://devthots.blogspot.com/

希望幫助!

+0

謝謝@crazypfan。是的,我已經在API控制檯中註冊了一個客戶端ID以及一個App Engine App ID。您提供的鏈接和其他來源之間,目前尚不清楚究竟應該用於在後端cliendIds和觀衆,和「觀衆」在GoogleAccountCredentials(背景下,受衆)。你能幫忙嗎? – aez 2013-03-07 12:16:18

0

我希望這可以幫助你。

import android.accounts.Account; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.FragmentActivity; 

import com.google.android.gms.auth.GoogleAuthException; 
import com.google.android.gms.auth.GoogleAuthUtil; 
import com.google.android.gms.auth.api.Auth; 
import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 
import com.google.android.gms.auth.api.signin.GoogleSignInResult; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.urbanft.utils.AppToast; 

import java.io.IOException; 

/** 
* Created by kiwitech on 13/10/16. 
*/ 

public class GoogleLogin extends FragmentActivity implements GoogleApiClient.OnConnectionFailedListener { 

    private GoogleSignInOptions gso; 
    protected GoogleApiClient mGoogleApiClient; 
    private int RC_SIGN_IN = 100; 
    public static String GOOGLE_ACCESS_TOKEN = "google_access_token"; 
    public static String GOOGLE_USER_ID = "google_user_id"; 
    private String mGooglesUserId; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     initialize(); 
    } 

    private void initialize(){ 
     gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .build(); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this , this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 
    } 

    protected void goForGoogleSignIn(){ 
     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
     startActivityForResult(signInIntent, RC_SIGN_IN); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == RC_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if(result.isSuccess()){ 
       AppToast.showToast(this,"Google sign-in success"); 
       mGooglesUserId = result.getSignInAccount().getId(); 
       new LocalAsyncTask(result.getSignInAccount().getEmail()).execute(); 
      }else{ 
       AppToast.showToast(this,"Google sign-in failure"); 
       onBackPressed(); 
       finish(); 
      } 
     } 
    } 

    class LocalAsyncTask extends AsyncTask<String,String,String> { 

     private String email; 

     LocalAsyncTask(String email) { 
      this.email = email; 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      String token = null; 
      try { 
       String SCOPE = "oauth2:https://www.googleapis.com/auth/userinfo.profile"; 
       Account account = new Account(email, "com.google"); 
       token = GoogleAuthUtil.getToken(GoogleLogin.this, account, SCOPE); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (GoogleAuthException e) { 
       e.printStackTrace(); 
      } 
      return token; 
     } 

     @Override 
     protected void onPostExecute(String s){ 
      Intent intent =new Intent(); 
      intent.putExtra(GOOGLE_ACCESS_TOKEN,s); 
      intent.putExtra(GOOGLE_USER_ID,mGooglesUserId); 
      setResult(Activity.RESULT_OK, intent); 
      onBackPressed(); 
      finish(); 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    } 
}