Sobes.tech
Middle+

Como garantir o acesso seguro ao token de autorização para outra aplicação?

sobes.tech IA

Resposta da IA

Podem ser considerados vários métodos.

  1. Content Provider com acesso restrito: Criar um ContentProvider próprio, no qual implementar a lógica para obter o token. Restringir o acesso usando permissões, que serão definidas no manifesto da sua aplicação. Outra aplicação deverá solicitar essa permissão para poder aceder ao Content Provider.

    <!-- No AndroidManifest.xml da sua aplicação -->
    <permission android:name="com.your_app.PERMISSION_GET_TOKEN"
                android:label="@string/permission_get_token_label"
                android:description="@string/permission_get_token_description"
                android:protectionLevel="signature" />
    
    <application ...>
        <provider
            android:name=".TokenContentProvider"
            android:authorities="com.your_app.token_provider"
            android:exported="true"
            android:readPermission="com.your_app.PERMISSION_GET_TOKEN"
            ... />
    </application>
    
    // Exemplo de implementação de ContentProvider
    public class TokenContentProvider extends ContentProvider {
        // ... implementação de query() para emitir o token com verificação de permissões ...
    }
    

    Outra aplicação deverá declarar o pedido desta permissão:

    <!-- No AndroidManifest.xml da outra aplicação -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    O nível protectionLevel="signature" garante que apenas aplicações assinadas com a mesma chave possam aceder ao Content Provider. É a opção mais segura para trocar dados entre aplicações da mesma empresa (mesmo desenvolvedor).

  2. Service com ligação e verificação UID/PackageName: Criar um serviço (Service) que fornecerá um método para obter o token. Outra aplicação pode ligar-se a esse serviço (bindService). Dentro do serviço, ao processar a solicitação, pode obter o UID ou PackageName da aplicação que chama e verificar se é confiável.

    // Exemplo de implementação de Service com AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                // Verificação do chamador por getCallingUid() ou getPackagesForUid()
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                // Verificação de pacotes em relação à lista permitida
                if (isAllowedPackage(packages)) {
                    // Retornar o token (assumindo que o token é armazenado de forma segura)
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Acesso não autorizado");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) é usada para definir a interface do serviço para interação entre processos.

  3. SharedPreferences com modo MODE_WORLD_READABLE (não recomendado): Guardar o token em SharedPreferences com a flag MODE_WORLD_READABLE. Isso permite que qualquer aplicação leia esse ficheiro. Este método está obsoleto e não é recomendado devido ao baixo nível de segurança.

    // Método inseguro (obsoleto)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Transmissão via Intent com restrições: Transmitir o token via Intent (por exemplo, via startActivity com dados). No entanto, este é o método menos seguro, pois os dados no Intent podem ser interceptados. Se for necessário transmitir o token desta forma, deve-se usar dados encriptados e verificar assinatura digital ou PackageName da aplicação receptora.

    // Exemplo (requer medidas adicionais de segurança)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // O token deve estar encriptado
    startActivity(intent);
    

A escolha do método depende dos requisitos de segurança e do nível de confiança entre a sua aplicação e a aplicação que necessita de acesso ao token. Os métodos mais seguros são Content Provider e Service com verificação explícita do chamador.