Para ative a proteção de aplicativo em seus apps Android, integre o Anti-Bot SDK (referido como SDK neste tópico) antes de ativar o recurso.
Limitações
O nível 16 ou superior da API do Android é obrigatório. Se o seu app tiver como alvo um nível de API anterior, o SDK não funcionará conforme o esperado.
Pré-requisitos
Antes de começar, verifique se você tem:
A proteção de aplicativo adquirida e habilitada. Consulte Procedure to enable app protection.
O pacote do SDK (arquivo AAR) para Android. Entre em contato com o suporte técnico no grupo de service do DingTalk ou envie um ticket para solicitá-lo. O nome do arquivo é
AliTigerTally_X.Y.Z.aar, em queX.Y.Zrepresenta o número da versão.A app key (chave de autenticação do SDK). Para obtê-la, faça login no console do WAF, escolha Protection Config > Website Protection, acesse a aba Bot Management, ative App Protection e clique em Obtain and Copy Appkey.
Cada conta Alibaba Cloud possui uma app key única, válida para todos os nomes de domínio na sua instância do Web Application Firewall (WAF), tanto para apps Android quanto iOS. Exemplo de app key:
****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****
Como funciona
O SDK assina cada requisição de saída do seu app. O WAF verifica essas assinaturas no servidor para detectar e bloquear tráfego malicioso e, em seguida, encaminha as requisições legítimas ao seu servidor de origem.
(Opcional) Crie um projeto de teste Android
Se quiser praticar as etapas de integração antes de aplicá-las ao app de produção, crie primeiro um projeto de teste no Android Studio.
A figura a seguir mostra um exemplo de projeto de teste chamado TigerTally_sdk_test.
Execute o projeto de teste para verifique se ele funciona antes de prosseguir.
Integre o SDK
Etapa 1: Abra o projeto no Android Studio
Abra seu projeto no Android Studio e acesse o diretório de arquivos do projeto.
Etapa 2: Adicione a dependência AAR
Copie o arquivo
AliTigerTally.aarpara o diretóriolibsdo seu projeto. Você também pode arrastar o arquivo diretamente para esse diretório.-
Abra o arquivo
build.gradlee adicione as seguintes configurações:-
Declare
libscomo repositório local:repositories { flatDir { dirs 'libs' } } -
Adicione uma dependência de compilação:
dependencies { compile(name: 'AliTigerTally_X.Y.Z', ext: 'aar') }Importante: Substitua
X.Y.Zpelo número real da versão presente no nome do arquivo AAR baixado.
-
Clique em Sync Now para aplicar as alterações.
-
Se utilizar o ProGuard para ofuscar seu app, adicione a seguinte regra ao arquivo de configuração do ProGuard logo após incluir a dependência. Isso evita que as classes do SDK sejam removidas durante a compilação, o que causaria falhas em tempo de execução.
-keep class com.aliyun.TigerTally.* {*;}
Etapa 3: Configure filtros de biblioteca nativa (se necessário)
Ignore esta etapa se seu projeto já incluir um arquivo SO. Caso contrário, adicione o seguinte bloco ndk ao arquivo build.gradle:
android {
defaultConfig {
ndk {
abiFilters 'arm64-v8a', 'x86', 'armeabi-v7a'
//abiFilters "armeabi-v7a"
}
}
}
Etapa 4: Solicite permissões
Adicione as seguintes permissões ao arquivo AndroidManifest.xml. Apenas a permissão INTERNET é obrigatória para o funcionamento do SDK.
|
Permissão |
Obrigatória |
Solicitação em tempo de execução (Android 6.0+) |
Descrição |
|
|
Sim |
Não — concedida automaticamente na instalação |
Permite que o SDK envie requisições assinadas ao WAF. |
|
|
Não |
Não — concedida automaticamente na instalação |
Lê o status de rede do dispositivo para aprimorar os sinais de risco. |
|
|
Não |
Não — concedida automaticamente na instalação |
Lê o status da conexão Wi-Fi para aprimorar os sinais de risco. |
|
|
Não |
Sim — solicite em tempo de execução |
Lê a identidade do dispositivo para aprimorar os sinais de risco. |
|
|
Não |
Não — concedida automaticamente na instalação |
Lê informações de dispositivos Bluetooth para aprimorar os sinais de risco. |
|
|
Não |
Sim — solicite em tempo de execução |
Lê o armazenamento externo para aprimorar os sinais de risco. |
|
|
Não |
Não — concedida automaticamente na instalação |
Modifica o estado de conectividade de rede para aprimorar os sinais de risco. |
Etapa 5: Adicione o código de integração
5a. (Opcional) Defina o ID do usuário
Chame setAccount() para associar um ID de usuário às requisições do SDK. Isso ajuda o WAF a aplicar políticas de proteção no nível do usuário. Ignore esta chamada se o usuário não estiver conectado; nesse caso, chame init() diretamente.
// Signature: int setAccount(String account)
// Returns: 0 on success, -1 on failure
final String account = "account"; // Use a masked user ID
TigerTallyAPI.setAccount(account);
|
Parâmetro |
Tipo |
Descrição |
|
|
|
O ID do usuário. Utilize um valor mascarado para proteger a privacidade do usuário. |
5b. Inicialize o SDK
Chame init() uma vez na inicialização do app. Essa ação coleta informações do dispositivo uma única vez para análise de risco.
Dois modos de coleta estão disponíveis:
DEFAULT: Coleta todos os dados do dispositivo, incluindo campos sensíveis (imei,imsi,simSerial,wifiMac,wifiList,bluetoothMac). Requer as permissões correspondentes. Utilize este modo após o usuário aceitar a política de privacidade do app.NOT_GRANTED: Ignora campos sensíveis. Recomendado quando o usuário ainda não aceitou a política de privacidade.
// Signature: int init(Context context, String appkey, int type)
// Returns: 0 on success, -1 on failure
final String appkey = "your_appkey";
// Full data collection (after user accepts privacy policy)
int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.DEFAULT);
// Exclude sensitive fields (before user accepts privacy policy)
int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.NOT_GRANTED);
Log.d("AliSDK", "ret:" + ret);
|
Parâmetro |
Tipo |
Descrição |
|
|
|
O contexto da aplicação. |
|
|
|
A app key obtida no console do WAF. |
|
|
|
Modo de coleta de dados: |
5c. Assine a requisição
Chame vmpSign() antes de cada requisição http de saída. Passe o corpo da requisição como array de bytes; para requisições GET ou corpos POST vazios, passe null ou "".getBytes("UTF-8").
// Signature: String vmpSign(int signType, byte[] input)
// Returns: the wToken signature string
String request_body = "i am the request body, encrypted or not!";
String wToken = null;
try {
wToken = TigerTallyAPI.vmpSign(1, request_body.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Log.d("AliSDK", "wToken:" + wToken);
|
Parâmetro |
Tipo |
Descrição |
|
|
|
Algoritmo de assinatura. Defina como |
|
|
|
O corpo da requisição a ser assinado. Passe |
5d. Adicione a assinatura ao cabeçalho http
Defina o valor de wToken como propriedade de cabeçalho http antes de enviar a requisição. O exemplo a seguir utiliza HttpURLConnection:
String request_body = "i am the request body, encrypted or not!";
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL("https://www.aliyundoc.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("POST");
// Add the wToken signature to the request header
conn.setRequestProperty("wToken", wToken);
OutputStream os = conn.getOutputStream();
// Write the request body
byte[] requestBody = request_body.getBytes("UTF-8");
os.write(requestBody);
os.flush();
os.close();
int code = conn.getResponseCode();
Log.d("respCode", Integer.toString(code));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
O que acontece após a integração
Após a integração, para cada requisição de saída enviada pelo seu app:
A função
vmpSign()gera uma assinaturawTokena partir do corpo da requisição.Seu código anexa o
wTokencomo cabeçalho http.O WAF inspeciona o cabeçalho
wToken, bloqueia requisições com falha na verificação de assinatura e encaminha as válidas ao servidor de origem.