【问题标题】:Make authorized request to Google Endpoint API from Android Client从 Android 客户端向 Google Endpoint API 发出授权请求
【发布时间】:2015-10-15 23:42:41
【问题描述】:

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

基本上我需要在请求中发送授权令牌作为标头,人们建议,只需在请求中添加“GoogleAccountCredential”实例即可,如下面的代码所示。下面代码所在的类扩展了 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. 我有一个名为 ExpandedListViewActivity 的活动
  2. 另一件事是 ExpandedListAdaptor,它动态地填充视图(表单)。

我的目标

  1. 当用户点击表单中的提交时。

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

  3. 如果没有找到,则显示帐户选择器视图,以便用户选择帐户,如果我们可以在未经用户同意的情况下静默进行操作,那就太好了。

我拥有的额外方法:

类 EndpointsAsyncTask 扩展 AsyncTask、Void、 字符串>

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;
    }

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

感谢阅读。 沙申克

【问题讨论】:

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


【解决方案1】:

这解决了我的问题。

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. 向所有公开的方法添加一个用户参数,以通过授权进行保护。
  3. 为任何 Android 客户端再次生成客户端库
  4. 重新部署您的后端 API。

谢谢, 沙申克

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 2014-11-06
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2016-06-05
    • 2022-12-09
    • 2020-01-24
    相关资源
    最近更新 更多