Crie um serviço de classificação de Box usando FastAPI

Jan 25 2023
No artigo Introdução às classificações do Box, aprendemos como criar rótulos e políticas de classificação para serem aplicadas automaticamente ao seu conteúdo dentro do Box. Essas políticas permitem algumas personalizações, no entanto... E se precisarmos de alguma lógica de negócios realmente complexa para classificação de conteúdo? Bem, existe uma API para isso e vamos explorar um exemplo, desta vez, usando python e FastAPI para criar um serviço de classificação personalizado.

No artigo Introdução às classificações do Box, aprendemos como criar rótulos e políticas de classificação para serem aplicadas automaticamente ao seu conteúdo dentro do Box.

Essas políticas permitem algumas personalizações, no entanto…

E se precisarmos de alguma lógica de negócios realmente complexa para classificação de conteúdo?

Bem, existe uma API para isso e vamos explorar um exemplo, desta vez, usando python e FastAPI para criar um serviço de classificação personalizado.

Visão geral

O caso de uso é derivado do aplicativo de amostra anterior, em que a certificação do mergulhador e os cartões de seguro são carregados no aplicativo pelos usuários e queremos "carimbar" esse conteúdo com um PIIrótulo.

Para isso estou utilizando webhooks para captação de eventos relacionados ao conteúdo. O webhook fará ping em nosso serviço de classificação, que por sua vez "carimbará o conteúdo com o rótulo apropriado.

Entre o evento e a chamada de classificação, você pode inserir as regras de negócios que desejar.

Se você quiser dar um passo atrás e ler como chegamos aqui, recomendo dar uma olhada nestes artigos anteriores:

Precisamos configurar algumas coisas em nosso aplicativo Box.

Primeiro, vamos ao console de administração e, em classificação , crie um novo rótulo.

criando um novo rótulo de classificação

Em seguida, precisamos criar um webhook em nosso aplicativo, por meio do console do aplicativo .

criando um webhook

Para simplificar o exemplo, apliquei o webhook para monitorar eventos em qualquer arquivo dentro da ClassificationServicepasta.

Mostre-me o código

O ponto de entrada principal é realmente bastante estreito.

@app.post("/box/classify")
async def classify(
    request: Request,
    settings: config.Settings = Depends(get_settings),
    db: Session = Depends(get_db),
):
    """ Classify endpoint"""

    body_json = await request.json()
    body = await request.body()

    # check for valid signatures
    is_valid = box_webhooks.webhook_signature_check(
            webhook_id, body, request.headers, db, settings
        )
    
    if not is_valid:
        raise HTTPException(status_code=404, detail="Invalid signature")

    box_webhooks.classify_file(body_json["source"]["id"], db, settings)

    return {"ok": True}

def webhook_signature_check(
    webhook_id: str,
    body: bytes,
    header: dict,
    db: Session,
    settings: Settings,
) -> bool:
    """check the signature of the webhook request"""
    # get a client object
    client = jwt_check_client(db, settings)
    # get a webhook object
    webhook = client.webhook(webhook_id)
    
    # get the signature keys
    key_a = settings.WH_KEY_A
    key_b = settings.WH_KEY_B
    
    # validate message body
    return webhook.validate_message(body, header, key_a, key_b)

Se tudo der certo, podemos prosseguir para realmente classificar o arquivo.

def classify_file(file_id: str, db: Session, settings: Settings):
    """classify a file"""

    classification = settings.CLASSIFICATION
    client = jwt_check_client(db, settings)

    file = client.file(file_id)
    # file.get()
    # file.get_all_metadata()

    # the super complex file classification rules go in here

    file_class = file.get_classification()

    if file_class is None or file_class != classification:
        file_class = file.set_classification(classification)

Agora é onde você pode plugar todas as regras de negócios necessárias para classificar o arquivo. Você poderia enviar as informações ou até mesmo o arquivo para um modelo de IA para classificação, correlacioná-lo com outros dados, etc.

Este exemplo é simples e apenas carimbará cegamente todos os arquivos nesta pasta com o PIIrótulo, o que pode ser obtido usando uma política existente simples, estou apenas tentando ilustrar o caso de uso.

Veja em ação

Como de costume, este exemplo totalmente funcional pode ser clonado deste repositório do GitHub .

Vamos ver o que acontece quando carrego um arquivo na pasta especificada:

carregando um arquivo

Isso aciona o webhook para executar ping em nosso serviço de classificação:

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [3292] using WatchFiles
INFO:     Started server process [3311]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     10.1.1.70:39278 - "POST /box/classify HTTP/1.0" 200 OK

arquivo como foi classificado

Embora as classificações automáticas dentro do Box sejam bastante poderosas, a Plataforma Box permite que você implemente qualquer lógica de negócios que desejar para classificar seu conteúdo.

Confira os outros artigos desta série Box Shield and Classification: