Google Cloud端点OAuth身份验证

时间:2014-07-22 11:05:54

标签: android google-app-engine oauth google-cloud-endpoints

我正在使用Google App Engine上运行的后端开发Android添加,并且最近激活了OAuth2身份验证。 我的问题是,当我进行全新安装并且用户之前没有使用他的谷歌帐户登录时,我会显示登录对话框,之后他可以通过按Facebook登录按钮登录。在从Facebook接收数据后,我对我的后端进行了授权调用,问题是这不会执行。 如果我重新启动应用并且用户已经使用他的Google帐户登录,那么一切正常。 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;
}

chooseAccount方法:

 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网站上的教程所示),但由于某种原因,调用根本没有执行。没有凭据的呼叫会引发正确的未经授权的异常。

1 个答案:

答案 0 :(得分:0)

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

要与任何其他提供商进行身份验证,您需要编写自定义代码。您可以通过在API参数中传递facebook auth信息来完成此操作。