从 Android 客户端向 Google 端点 API 发出授权请求

Make authorized request to Google Endpoint API from Android Client

我需要识别通过 Android 客户端向我的端点 api 发出请求的用户。尽管我能够通过使用 gradle 和 android studio 将我的 Api 和 App 保留在一个项目中来遵循最佳实践。我也可以向我的端点 api 发送请求并在未经授权的情况下接收响应。

基本上我需要在请求中将授权令牌作为 header 发送,人们建议,仅通过在请求中添加 "GoogleAccountCredential" 的实例就可以达到下面代码中的效果。 class,其中存在扩展 android.os.AsyncTask 的以下代码;一直在关注https://cloud.google.com/appengine/docs/java/endpoints/consume_android#using_the_account_picker,但是代码片段不是很清楚

@Override
protected String doInBackground(Pair<Context, String>... params) {
..
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), credential).setRootUrl("https://myapp.appspot.com/_ah/api/");
..

我有:

  1. 我有一个 Activity 叫做 ExpandedListViewActivity
  2. 另一个是 ExpandedListAdaptor,它动态填充视图(表单)。

我的Objective

  1. 当用户点击提交时出现在表单中。

  2. Android 应该能够找到 google 帐户及其凭据并将其附加到请求中。

  3. 如果没有找到然后显示帐户select或查看,这样用户就可以select帐户,如果我们可以在没有用户同意的情况下默默地做这将是非常不错

我拥有的额外方法:

class EndpointsAsyncTask extends AsyncTask, Void, String>

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

    protected String fetchToken() throws IOException {
        try {
            return GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
        } catch (UserRecoverableAuthException userRecoverableException) {
            // GooglePlayServices.apk is either old, disabled, or not present
            // so we need to show the user some UI in the activity to recover.
            userRecoverableException.printStackTrace();
        } catch (GoogleAuthException fatalException) {
            // Some other type of unrecoverable exception has occurred.
            // Report and log the error as appropriate for your app.

        }
        return null;
    }


    public void getSettings(){
        Log.d(APP, "get Settings ");
        settings = mActivity.getSharedPreferences("Api", 0);

        credential = GoogleAccountCredential.usingAudience(mActivity,
                "server:client_id:Android-clientId.apps.googleusercontent.com");
        setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
    }

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

请注意我的端点服务器端已正确配置并且 运行。 应该是直截了当的,但我无法解决这个问题,请指出错误或告诉我解决这个问题的方向..

感谢阅读。 沙山克

这解决了我的问题。

http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html

https://cloud.google.com/appengine/docs/java/endpoints/auth

  1. 指定授权向您的 API 后端发出请求的应用程序的客户端 ID (clientIds)。
  2. 为所有公开的方法添加一个 User 参数以受授权保护。
  3. 为任何 Android 个客户再次生成客户端库
  4. 重新部署你的后端 API。 <-- 这是解决这个问题的关键。

谢谢, 沙山克