Android Google云端点OAuth身份验证

Android Google云端点OAuth身份验证,android,google-app-engine,oauth,google-cloud-endpoints,Android,Google App Engine,Oauth,Google Cloud Endpoints,我正在开发一个Android add,其后端运行在Google App Engine上,最近激活了OAuth2身份验证。 我的问题是,当我有一个新的安装,并且用户之前没有使用他的谷歌帐户登录时,我会显示登录对话框,然后他可以通过按“使用Facebook登录”按钮登录。在收到Facebook的数据后,我向我的后端打了一个授权电话,问题是这不会执行。 如果我重新启动应用程序,并且用户已经使用他的谷歌帐户登录,那么一切正常。 PS:在这两种情况下,我都在凭证中设置了所选的帐户名 你知道为什么在这种情况

我正在开发一个Android add,其后端运行在Google App Engine上,最近激活了OAuth2身份验证。 我的问题是,当我有一个新的安装,并且用户之前没有使用他的谷歌帐户登录时,我会显示登录对话框,然后他可以通过按“使用Facebook登录”按钮登录。在收到Facebook的数据后,我向我的后端打了一个授权电话,问题是这不会执行。 如果我重新启动应用程序,并且用户已经使用他的谷歌帐户登录,那么一切正常。 PS:在这两种情况下,我都在凭证中设置了所选的帐户名

你知道为什么在这种情况下不发送请求吗

用于创建凭据的代码:

    settings = getSharedPreferences("whostrPrefs", MODE_PRIVATE);
    credential = GoogleAccountCredential.usingAudience(this, ID);

    setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));

    if(credential.getSelectedAccountName() != null)
    {
        //all ok
        Log.d("AccountName", "Everything is ok!");
    }
    else
    {
        Log.d("AccountName", "User needs to loggin!");
        chooseAccount();
    }
setSelectedAccount方法:

private void setSelectedAccountName(String accountName)
{
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(PREF_ACCOUNT_NAME, accountName);
    editor.commit();

    credential.setSelectedAccountName(accountName);
    this.accountName = accountName;
}
 void chooseAccount()
{
    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}
chooseAccount方法:

private void setSelectedAccountName(String accountName)
{
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(PREF_ACCOUNT_NAME, accountName);
    editor.commit();

    credential.setSelectedAccountName(accountName);
    this.accountName = accountName;
}
 void chooseAccount()
{
    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}
以及onActivityResult方法的代码段:

            case REQUEST_ACCOUNT_PICKER:
            if(data != null && data.getExtras() != null)
            {
                String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME);
                if(accountName != null)
                {
                    setSelectedAccountName(accountName);
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString(PREF_ACCOUNT_NAME, accountName);
                    editor.commit();
                    Log.d("AccountName", "User is authorized!");
                    //user is authorized
                }
            }
            break;
而实际通话:

          Userendpoint.Builder builder = new Userendpoint.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential);
            Userendpoint service = builder.build();

           try
        {
        response = service.loginuser(params[0], params[1], params[2], params[3],              longitude,latitude).execute();
        }
有什么问题吗?我做错什么了吗?密码到达我打电话的地方。。。但是没有通过


LE:对端点的调用是使用Google登录凭据进行的(如Google App Engine网站上的教程所示),但由于某些原因,根本不会执行调用。在没有凭据的情况下调用会引发正确的未授权异常。

云端点的内置身份验证仅适用于Google登录(或OpenID,取决于创建项目时选择的身份验证类型)


对于任何其他提供者的身份验证,您需要编写自定义代码。您可以通过在API参数中传递facebook身份验证信息来实现这一点。

No,对于端点身份验证,我正在使用Google登录。Facebook登录仅用于链接到用户的Facebook帐户。我的问题是,当用户第一次选择Google帐户时,请求就没有发出。如果我重新启动应用程序,一切正常。或者有没有一种方法可以在不使用谷歌登录或任何其他类型的登录的情况下对端点进行身份验证调用?听起来像是事件序列问题。只有在加载依赖项(脚本)后才能触发API调用。也可以使用signin回调。在这里的示例代码中显示了一个很好的事件排序技巧:不确定情况是否如此。我遵循了谷歌网站上的教程,在打电话的那一刻,我已经设置了正确的凭证。我知道Google Play服务在发送前用于验证应用程序,这是否可能是因为我的应用程序尚未上载到Google Play?