限制Android应用程序访问我的API端点

限制Android应用程序访问我的API端点,android,google-app-engine,oauth-2.0,google-cloud-endpoints,Android,Google App Engine,Oauth 2.0,Google Cloud Endpoints,我想限制我的API端点只能访问我的android应用程序,但不能使用google_帐户/密码。 我可以选择这些方法: 为了进行测试,我使用以下方法成功地将我的android应用程序验证到我的API: ==>此方法允许您使用combo对应用程序进行身份验证: 登录/密码(谷歌账户) 您的android应用程序的SHA1和软件包名称 因此,如果有人获取我的代码(反编译apk)并修改我的android代码,他们将无法访问我的API,因为我的应用程序的SHA1指纹将发生变化。(我对它进行了测试,它可

我想限制我的API端点只能访问我的android应用程序,但不能使用google_帐户/密码。 我可以选择这些方法:

为了进行测试,我使用以下方法成功地将我的android应用程序验证到我的API: ==>此方法允许您使用combo对应用程序进行身份验证:

  • 登录/密码(谷歌账户)
  • 您的android应用程序的SHA1和软件包名称
因此,如果有人获取我的代码(反编译apk)并修改我的android代码,他们将无法访问我的API,因为我的应用程序的SHA1指纹将发生变化。(我对它进行了测试,它可以正常工作=) 这个方法很好用,但我不想用谷歌登录/密码进行身份验证

所以我尝试了这个方法: 我成功验证了我的android应用程序,但是,如果我的android代码被其他人修改(因此SHA1发生了更改),我的android应用程序仍然可以连接到我的API!!因此,如果有人得到我的包并对其进行反编译,他将免费更改代码并成功访问我的API。

以下是我的API代码:

@ApiMethod( name = "ListCampagnes", httpMethod = ApiMethod.HttpMethod.GET, path="list", clientIds = {CONSTANTES.ANDROID_CLIENT_ID, CONSTANTES.WEB_CLIENT_ID, CONSTANTES.SERVICE_CLIENT_ID, com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID}, audiences = {CONSTANTES.ANDROID_AUDIENCE})

public Collection<Campagne> getCampagnes(@Named("NumPortable")String NumPortable, User user) throws  UnauthorizedException {

    if (user == null) throw new UnauthorizedException("User is Not Valid");

        return CampagneCRUD.getInstance().findCampagne(NumPortable);
    }
我是否尝试其他方法来验证我的android应用程序?还是我的API代码中遗漏了什么?
提前感谢looot,

在没有谷歌用户帐户的情况下验证Android端点是不可能的!我尝试了各种方法,但仍然不起作用

因此,这里是我解决这个问题的方法,不需要任何用户交互(可能不是正确的,但这是可行的,而且您已经获得了强大的身份验证(SHA1+Google帐户)):

这是我的ANDROID代码

获取并生成有效凭证

  //Get all accounts from my Android Phone
         String validGoogleAccount = null;
         Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
         Account[] accounts = AccountManager.get(context).getAccounts();
         for (Account account : accounts) {
             if (emailPattern.matcher(account.name).matches()) {
                 //Just store mail if countain gmail.com
                 if (account.name.toString().contains("gmail.com")&&account.type.toString().contains("com.google")){
                     validGoogleAccount=account.name.toString();
                 }

             }
         }

        //Build Credential with valid google account
        GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(this,"server:client_id:301991144702-5qkqclsogd0b4fnkhrja7hppshrvp4kh.apps.googleusercontent.com");
        credential.setSelectedAccountName(validGoogleAccount);
将此凭据用于安全通话

Campagneendpoint.Builder endpointBuilder = new Campagneendpoint.Builder(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), credential);
这是我的API后端代码: API注释

@Api(
        scopes=CONSTANTES.EMAIL_SCOPE,
        clientIds = {CONSTANTES.ANDROID_CLIENT_ID, 
                     CONSTANTES.WEB_CLIENT_ID,
                     com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID},
        audiences = {CONSTANTES.ANDROID_AUDIENCE},      
        name = "campagneendpoint",
        version = "v1"
     )
方法代码:

public Collection<Campagne> getCampagnes(@Named("NumPortable")String NumPortable, User user) throws  UnauthorizedException {
        if (user == null) throw new UnauthorizedException("User is Not Valid");

      return CampagneCRUD.getInstance().findCampagne(NumPortable);
     }
public Collection getCampagnes(@Named(“NumPortable”)字符串NumPortable,User User)引发未经授权的异常{
如果(user==null)抛出新的UnauthorizedException(“用户无效”);
返回CampagneCRUD.getInstance().findCampagne(numimportable);
}
目前,它只适用于Android(我不知道我们在IOS上该怎么做…)

希望它能帮助你

public Collection<Campagne> getCampagnes(@Named("NumPortable")String NumPortable, User user) throws  UnauthorizedException {
        if (user == null) throw new UnauthorizedException("User is Not Valid");

      return CampagneCRUD.getInstance().findCampagne(NumPortable);
     }