【问题标题】:Google Cloud Endpoints OAuth AuthenticationGoogle Cloud Endpoints OAuth 身份验证
【发布时间】:2014-07-22 20:40:06
【问题描述】:

我正在开发一个在 Google App Engine 上运行后端的 Android 插件,并且最近激活了 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;
}

chooseAccount 方法:

 void chooseAccount()
{
    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}

还有来自 onActivityResult 方法的 sn-p:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 不,对于端点身份验证,我使用的是 Google 登录。 Facebook 登录仅用于链接到用户的 Facebook 帐户。我的问题是用户第一次选择 Google 帐户时没有发出请求。如果我重新启动应用程序,一切正常。
    • 或者有没有一种方法可以在不使用 Google 登录或任何其他类型的登录的情况下对端点进行经过身份验证的调用?
    • 听起来像是事件顺序问题。您必须仅在加载依赖项(脚本)后触发 API 调用。也使用登录回调。此处的示例代码显示了对事件进行排序的一个很好的技巧:developers.google.com/appengine/docs/java/endpoints/…
    • 不确定是不是这样。我按照谷歌网站上的教程进行操作,在通话时我设置了正确的凭据。我知道在发送之前使用 Google Play 服务对应用进行身份验证,这可能是由于我的应用尚未上传到 Google Play 造成的吗?
    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 2016-02-03
    • 2017-07-06
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多