Ошибка аутентификации конечных точек облака в приложении для Android

У меня возникли проблемы с первой попыткой использовать аутентификацию в режиме отладки в приложении Google Cloud Endpoints для 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 (неизвестный источник) 03-06 23:33:20.423: W/System.err(11861): на com.google.android.gms.auth.GoogleAuthUtil .getToken (неизвестный источник) 03-06 23:33:20.428: W/System.err(11861): в com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java :192)


person aez    schedule 07.03.2013    source источник
comment
Вы используете физическое устройство, а не эмулятор, верно?   -  person Dan Holevoet    schedule 07.03.2013


Ответы (3)


Возможно, у вас неправильный отпечаток сертификата (SHA1) для вашего идентификатора клиента Android? Аутентификация с помощью отпечатка вашего производственного ключа работает только в том случае, если вы подписываете .apk вручную.

Зарегистрируйте Client-Id для установленного приложения (Android) со своим отпечатком debug.keystore в вашей консоли API. Для получения отпечатка пальца используйте:

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

Также вам нужен Web-Client-Id и установите его как Audience в вашем 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}

)

person Nipper    schedule 11.03.2013
comment
Я удалил идентификатор клиента из консоли API и не могу создать новый идентификатор клиента Android с правильным именем пакета. Не могли бы вы мне помочь? @Ниппер - person Renan Franca; 22.05.2014

Просто удостоверяюсь, но вы зарегистрировали идентификатор клиента в консоли API Google, а также идентификатор приложения App Engine? А этот гугл-аккаунт добавлен на устройство?

Инструкции в этом блоге могут быть полезны:
http://devthots.blogspot.com/

Надеюсь, это поможет!

person crazylpfan    schedule 07.03.2013
comment
Спасибо @crazypfan. Да, я зарегистрировал идентификатор клиента в консоли API вместе с идентификатором приложения App Engine. Между предоставленной вами ссылкой и другими источниками неясно, что именно следует использовать для cliendIds и аудиторий на бэкэнде и аудитории в GoogleAccountCredentials (контекст, аудитория). Вы можете помочь с этим? - person aez; 07.03.2013

Я хочу, чтобы это могло помочь вам.

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) {
    }
}
person Tushar Pandey    schedule 13.10.2016