限制Android应用程序访问我的API端点
我想限制我的API端点只能访问我的android应用程序,但不能使用google_帐户/密码。 我可以选择这些方法: 为了进行测试,我使用以下方法成功地将我的android应用程序验证到我的API: ==>此方法允许您使用combo对应用程序进行身份验证:限制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指纹将发生变化。(我对它进行了测试,它可
- 登录/密码(谷歌账户)
- 您的android应用程序的SHA1和软件包名称
@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);
}