验证我的Android客户端以连接到端点

时间:2015-03-23 18:04:55

标签: android google-app-engine google-cloud-endpoints google-api-client urlconnection

我正在为在线报纸公司开发一个Android应用程序。该公司已经在支持OAuth 2.0的Google App Engine上开发和托管了他们的API 因此,我将开发一个Android应用程序,通过OAuth 2.0支持与其部署的后端API进行通信,并从其分配的Google API Explorer中获取内容Response。

所以根据Android客户端的谷歌云终端文档(比如我的应用程序)尝试通过OAuth 2.0支持对端点进行身份验证调用,我被引导到:

  1. 配置我的Android客户端(我的Android应用)以提供服务对象的凭据
  2. 选择帐户选择器以支持用户选择登录帐户。
  3. 我按照Google Cloud Endpoint网站上的说明操作,但我不了解用于解释的示例代码,所以我尝试了这个:

    class EndpointsAsyncTask extends AsyncTask<Void, Void, Void>{
    
           @Override
           protected Void doInBackground(Void... params) {
    
               HttpTransport httpTransport = new NetHttpTransport();
               JsonFactory jsonFactory = new  AndroidJsonFactory();
    
    
               try {
                   GoogleCredential credential = new GoogleCredential.Builder()
                           .setTransport(httpTransport)
                           .setJsonFactory(jsonFactory)
                           .setServiceAccountId(CLIENT_EMAIL)
                           .setServiceAccountScopes(Collections.singleton("https://www.googleapis.com/auth/userinfo.email"))
                           .setServiceAccountPrivateKeyFromP12File(new File("file.p12"))
                           .build();
    
               /*so now what do I do with the credential object 
              and how do I set the root URL (https://project-id-endpoints.appspot.com/_ah/api)
              that the android client(this android app)
             will connect to in the backend API call
             */
    
               }
               catch(GeneralSecurityException gse){
                   gse.printStackTrace();
               }
               catch(IOException ioe){
    
               }
    
    
               return null;
           }
    
           @Override
           protected void onPostExecute(Void aVoid) {
               super.onPostExecute(aVoid);
    
           }
       }
    

    无论何时运行我的代码,Google Developer Console上的日志报告都会显示

      

    &#34; Uauthorised access&#34;意味着身份验证调用无效...

    以下是我打开与其中一个API服务内容的GET URL连接的代码:

    public String open() throws IOException{
    
            InputStream inputStream = null;
            int len = 500;
    
            try {
                URL url = new URL("https://project-name-api-endpoints.appspot.com/_ah/api/core/v5.1.1/info/category/en");
    
                URLConnection urlConnection = url.openConnection();
    
                inputStream = urlConnection.getInputStream();
    
                String content = readIt(inputStream, len);
    
                return content;
            }//end try
    
            finally {
                if(inputStream != null)
                {
                    inputStream.close();
                }
            }
    
        }
    

    我的问题是:

    如何处理凭据对象以及如何在后端API调用中设置android客户端(此Android应用程序)将连接到的根URL(https://project-id-endpoints.appspot.com/_ah/api

1 个答案:

答案 0 :(得分:1)

问题是您没有使用在调用端点时设置的凭据。您正在建立的这种连接完全没有意识到所有OAuth设置以及您从端点+ Android获得的精彩内容。

理想情况下,您需要做的是:

1)从端点创建Android客户端库(如here所述)。不要制作&#34;手册&#34; (通过URLConenction)调用您的终端,虽然技术上可行,但绝对不推荐。

2)使用项目中包含的libs(jars),您需要做的就是调用您需要的任何方法(如here所述),并且库将根据您的应用包含所有必需的授权标题等设置。您不必担心OAuth的其他任何事情。

提示:确保在Google控制台上的授权中包含所有开发人员的SHA调试签名。如果你不这样做,你只能从你的&#34; prodcution&#34;中调用终点。应用