从Android客户端

时间:2015-07-25 09:39:53

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

我需要通过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,它动态填充视图(表单)。
  3. 我的目标

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

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

    3. 如果找不到,则显示帐户选择器视图,以便用户可以选择帐户,如果我们可以在没有用户同意的情况下以静默方式进行,那将是非常好的。

    4. 我所拥有的额外方法:

        

      class EndpointsAsyncTask扩展了AsyncTask,Void,   串GT;

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

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

      感谢阅读。 沙善

1 个答案:

答案 0 :(得分:0)

这解决了我的问题。

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。&lt; - 这是解决此问题的关键。
  5. 谢谢, 沙善