# Identidade verificada do widget

Assine no seu servidor quem está conversando: como se calcula, o que muda e como testar.

Guia HMAC-SHA256 No servidor

## Gere o segredo

Em Configurações › Chat web (widget) › Identidade verificada › Gerar segredo. Aparece uma só vez: guarde em uma variável de ambiente do servidor (BYDOMU_WIDGET_SECRET). Se você rotacionar, o anterior para de servir na hora e, até atualizar o servidor, seus usuários conversam como visitantes anônimos.

## Calcule userHash no servidor

`userHash = HMAC-SHA256(secreto, userId)` em hexadecimal. Use um id interno estável, não o e-mail nem algo que a pessoa possa mudar. Sem userId o e-mail é assinado, mas então o e-mail vira a identidade: use só se no seu site ele é verificado.

Node.js:

```js
import { createHmac } from "node:crypto";

// Tu backend: el usuario ya inició sesión en tu web.
app.get("/api/bydomu-identity", requireLogin, (req, res) => {
  const userId = String(req.user.id);              // estable: nunca cambia
  const userHash = createHmac("sha256", process.env.BYDOMU_WIDGET_SECRET)
    .update(userId)
    .digest("hex");
  res.json({ userId, email: req.user.email, name: req.user.name, userHash });
});
```

Python:

```python
import hashlib, hmac, os

def bydomu_identity(user):
    user_id = str(user.id)  # estable: nunca cambia
    user_hash = hmac.new(
        os.environ["BYDOMU_WIDGET_SECRET"].encode(), user_id.encode(), hashlib.sha256
    ).hexdigest()
    return {"userId": user_id, "email": user.email, "name": user.name, "userHash": user_hash}
```

PHP:

```php
<?php
$userId   = (string) $user->id; // estable: nunca cambia
$userHash = hash_hmac('sha256', $userId, getenv('BYDOMU_WIDGET_SECRET'));
```

Go:

```go
mac := hmac.New(sha256.New, []byte(os.Getenv("BYDOMU_WIDGET_SECRET")))
mac.Write([]byte(userID)) // estable: nunca cambia
userHash := hex.EncodeToString(mac.Sum(nil))
```

## Passe para a página

O navegador só recebe o resultado, nunca o segredo. Chame boot quando a pessoa entra e shutdown quando sai, para o próximo usuário do mesmo navegador não herdar a conversa.

```html
<script>
  // Después del código de instalación del widget.
  fetch("/api/bydomu-identity", { credentials: "include" })
    .then((r) => (r.ok ? r.json() : null))
    .then((identity) => identity && Domu("boot", identity));
</script>

<!-- Al cerrar sesión en tu web -->
<script>Domu("shutdown")</script>
```

## O que muda com uma assinatura válida

- Com userId, o contato é buscado por esse id (o «id externo»), não por e-mail: o e-mail não é assinado e ninguém pode reivindicar o contato de outro digitando o e-mail dele. Se não existe, é criado com origem WEBSITE.
- A conversa acompanha a pessoa entre dispositivos, e os atributos e eventos que a página enviou antes do login passam ao contato.
- A Noa vê o contato como verificado por 24 horas, e os atributos enviados com update contam como verificados (um sem assinatura nunca sobrescreve um verificado).
- Se a assinatura não bater ou não houver segredo, o chat continua anônimo e o visitante não vê erro.

## Teste

Compare o que o servidor calcula com openssl. Depois entre no seu site, escreva no chat e abra a conversa no ByDomu: o contato deve ser o do seu usuário, não um visitante novo.

```bash
# Debe dar lo mismo que tu servidor (hex en minúsculas)
printf '%s' 'u_123' | openssl dgst -sha256 -hmac "$BYDOMU_WIDGET_SECRET"

# Con el secreto «secreto_de_prueba» y userId «u_123»:
# 957e886ac44041d2fe2094ad46f8eade58ef58cd593a62e51d76a7f652d9e4ce
```

[A API JavaScript completa do widget](https://developers.bydomu.com/pt/guias/widget)
