# [Desconflito][Autenticação] Roteiro Etapa 1

### Criação de OIR

Uma *Operational Intent Reference(OIR)* é a representação 4D da intenção de operação de uma aeronave não tripulada. No ambiente UTM, a criação e edição de OIRs deve ser coordenada com os outros provedores presentes ou interessados na região da operação. Para possibilitar que essa coordenação seja feita programaticamente, o DECEA manterá um serviço de Descoberta, que é um local onde provedores podem declarar suas operações, assim como obter as operações de outros provedores numa área específica.

Nesse workshop, iremos aprender a interagir com esse serviço de descoberta, chamado DSS. O DSS provido pelo DECEA é derivado da implementação feita pelo projeto [InterUSS](https://interussplatform.org/), que por sua vez é uma implementação dos padrões ASTM-3411 e ASTM-3548. A comunicação com o DSS é feita via HTTP e os contratos estão definidos em: [https://github.com/dp-icea/Protocols](https://github.com/dp-icea/Protocols)

A complexidade na criação da OIR depende de quantas outras entidades (Constraints ou outras OIRs) estão presentes no mesmo volume 4D. Nesse workshop, iniciaremos com o cenário mais simples, evoluindo até o cenário mais complexo.

<details id="bkmrk-oir-isolada-%C2%A0"><summary>OIR isolada</summary>

<div drawio-diagram="456"><img src="https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/drawio/2024-06/drawing-3-1719771300.png" alt=""/></div>

</details><details id="bkmrk-oir-pr%C3%B3xima-a-constr"><summary>OIR próxima a Constraint</summary>

<div drawio-diagram="460"><img src="https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/drawio/2024-06/drawing-3-1719772649.png" alt=""/></div>

</details><details id="bkmrk-oir-com-conflito-mai"><summary>OIR com conflito</summary>

**Maior ou igual prioridade**

<div drawio-diagram="465"><img src="https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/drawio/2024-06/drawing-3-1719773244.png" alt=""/></div>

**Menor prioridade**

<div drawio-diagram="464"><img src="https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/drawio/2024-06/drawing-3-1719773229.png" alt=""/></div>

</details><details id="bkmrk-endpoints-de-coorden"><summary>Endpoints de coordenação</summary>

[![image.png](https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/gallery/2024-06/scaled-1680-/7QUimage.png)](https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/gallery/2024-06/7QUimage.png)

</details><details id="bkmrk-ativa%C3%A7%C3%A3o-de-oir-%28mom"><summary>Ativação de OIR (Momentos antes do voo)</summary>

Atualizar a OIR no DSS e notificar os Subscribers

[![image.png](https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/gallery/2024-06/scaled-1680-/mIlimage.png)](https://servicos2.decea.mil.br/br-utm/wiki/uploads/images/gallery/2024-06/mIlimage.png)

</details>#### Autenticação

<details id="bkmrk-autenticar-se-%C2%A0"><summary>Autenticar-se</summary>

A URL base é [`http://montreal.icea.decea.mil.br:64235/token`](http://montreal.icea.decea.mil.br:64235/token)

A requisição deve conter as seguintes *query\_strings*

<table border="1" style="border-collapse: collapse; width: 99.9786%; height: 106.033px;"><colgroup><col style="width: 50.0471%;"></col><col style="width: 50.0471%;"></col></colgroup><tbody><tr style="height: 46.5167px;"><td style="height: 46.5167px;">intended\_audience</td><td style="height: 46.5167px;"><span style="color: rgb(0, 0, 0);">USS de destino da mensagem (Domínio do provedor) Ex. "utm.decea.mil.br"</span></td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">scope</td><td style="height: 29.8px;"><span style="color: rgb(0, 0, 0);">escopo da requisição. Ex.: utm.strategic\_coordination.</span>

<span style="color: rgb(0, 0, 0);">O scope esperado de cada endpoint está definido no OpenAPI  
</span>

</td></tr><tr style="height: 29.7167px;"><td style="height: 29.7167px;">apikey</td><td style="height: 29.7167px;"><span style="color: rgb(0, 0, 0);">chave recebida do ICEA. Pode-se optar em enviar esse campo no Header da requisição  
</span></td></tr></tbody></table>

</details><details id="bkmrk-validar-autentica%C3%A7%C3%A3o"><summary>Validar autenticação de outro USS</summary>

Ao receber uma requisição de outro USS em seu servidor, é necessário validar o token de autenticação fornecido pelo outro USS. O payload do token contém as seguintes informações:

<table border="1" style="border-collapse: collapse; width: 99.9786%; height: 266.517px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr style="height: 46.5167px;"><td style="height: 46.5167px;">aud  
</td><td style="height: 46.5167px;">Domínio do seu provedor.</td><td style="height: 46.5167px;">"utm.provider1.com"  
</td></tr><tr style="height: 63.4px;"><td style="height: 63.4px;">exp  
</td><td style="height: 63.4px;">Timestamp epoch do horário de expiração do token. O token não deve ser aceito a partir desse horário  
</td><td style="height: 63.4px;">1719777868</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">iss  
</td><td style="height: 29.8px;">Nome do provedor emissor do token  
</td><td style="height: 29.8px;">ICEA  
</td></tr><tr style="height: 80.2px;"><td style="height: 80.2px;">scope  
</td><td style="height: 80.2px;">Scope autorizado pelo token. Cada endpoint deve aceitar apenas determinados scopes, conforme definido no OpenAPI  
</td><td style="height: 80.2px;">utm.strategic\_coordination  
</td></tr><tr style="height: 46.6px;"><td style="height: 46.6px;">sub  
</td><td style="height: 46.6px;">Nome do provedor origem da requisição. Não deve ser validado</td><td style="height: 46.6px;">"USS1"</td></tr></tbody></table>

Os passos para verificação são

1. Verificar assinatura do token 
    1. Deve-se validar a assinatura do token utilizando a chave pública do ICEA, que será fornecida durante o workshop.
2. Verificar a validade do token 
    1. Deve-se validar que o campo "exp" não seja menor do que o horário atual
3. Verficiar audiência do token 
    1. Deve-se validar que o campo "aud" seja o seu nome, ou seja, o nome do provedor que está recebendo a requisição
4. Verificar o scope 
    1. Deve-se validar que o campo "scope" contenha o scope necessário para requisitar o endpoint. Um token pode possuir mais de um scope separados por espaço em branco.

</details><details id="bkmrk-chave-publica-eco-ut"><summary>Chave Publica Eco-UTM</summary>

\-----BEGIN PUBLIC KEY-----  
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHkNtpy3GB0YTCl2VCCd22i0rJwI  
GBSazD4QRKvH6rch0IP4igb+02r7t0X//tuj0VbwtJz3cEICP8OGSqrdTSCGj5Y0  
3Oa2gPkx/0c0V8D0eSXS/CUC0qrYHnAGLqko7eW87HW0rh7nnl2bB4Lu+R8fOmQt  
5frCJ5eTkzwK5YczAgMBAAE=  
\-----END PUBLIC KEY-----

</details>