如何保护Azure API Management端点仅允许无登录安卓应用调用
针对无需用户登录的Android应用限制APIM访问的可行方案
你之前参考的是AAD用户授权流的配置,确实需要用户登录,以下3种方案都可以实现仅你的指定客户端调用API,不需要用户参与身份验证:
1. 双向TLS客户端证书认证
- 你可以生成一份专属的客户端证书,将证书的公钥指纹、序列号等信息配置到APIM对应API的校验策略中
- Android端将证书内置到应用安全存储区域,调用API时携带该客户端证书
- APIM收到请求后优先校验客户端证书信息,匹配成功才会放行请求,否则直接返回403拒绝访问
- 注意做好证书混淆保护,同时预留证书轮换机制,定期更新证书避免泄露风险
2. 订阅密钥+HMAC签名校验
- 首先在APIM中为该API创建专属订阅,获取订阅密钥,同时自定义一个只有你知道的签名密钥
- Android端每次发起请求时,将当前时间戳、请求路径、请求参数、订阅密钥拼接后,用签名密钥计算HMAC哈希值作为签名,将时间戳、签名、订阅密钥一同放入请求头
- APIM侧配置校验策略:首先校验请求时间戳与服务器时间差不超过5分钟(避免重放攻击),再用相同规则计算签名,与请求头携带的签名比对一致后才放行
- 注意签名密钥不要硬编码在APK代码中,存储到Android系统Keystore安全区域,降低被反编译窃取的概率
3. AAD OAuth2.0客户端凭据流
- 不需要用到需要用户登录的授权码流,改用客户端凭据流即可,该流专门用于服务/客户端本身的身份验证,无用户参与
- 在AAD中注册一个客户端应用,为该应用授予APIM的访问权限,配置APIM的JWT校验策略,校验AAD签发的客户端令牌
- Android端使用注册得到的客户端ID、客户端凭据(可以是密码或证书)向AAD请求访问令牌,调用API时在请求头携带Bearer令牌即可
- 该方案是Azure原生支持的能力,不需要自己实现签名校验逻辑,安全性更高,客户端凭据同样需要存储到Android安全存储区域
内容的提问来源于stack exchange,提问作者gariban
相关产品推荐
相关产品推荐

