> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/pt/configuracao/overleaf-toolkit/authentication/saml-authentication.md).

# Autenticação SAML

Esta funcionalidade foi desenvolvida por [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Aqui oferecemos alguns documentos para a sua configuração.

### Configuração

Internamente, o módulo SAML do Overleaf usa o [passport-saml](https://github.com/node-saml/passport-saml) biblioteca; a maioria das opções de configuração a seguir é passada para `passport-saml`. Se estiver a ter problemas ao configurar o SAML, vale a pena ler o README de `passport-saml` para ter uma ideia da configuração que ele espera.

A variável de ambiente `EXTERNAL_AUTH` é necessário para ativar o módulo de autenticação SAML. Esta variável de ambiente especifica quais métodos de autenticação externa estão ativados. O valor desta variável é uma lista. Se a lista incluir `saml` então a autenticação SAML será ativada.

Por exemplo: `EXTERNAL_AUTH=ldap saml`

Ao usar o método de autenticação SAML, um utilizador é redirecionado para o site de autenticação do Provedor de Identidade (IdP). Se o IdP autenticar com sucesso o utilizador, a base de dados de utilizadores do Overleaf é verificada à procura de um registo contendo um `samlIdentifiers` campo estruturado da seguinte forma:

```json
samlIdentifiers: [
  {
    externalUserId: "...",
    providerId: "1",
    userIdAttribute: "..."
  }
]
```

O `externalUserId` deve corresponder ao valor da propriedade especificada por `userIdAttribute` no perfil de utilizador devolvido pelo servidor IdP.

Se nenhum registro correspondente for encontrado, o banco de dados é pesquisado em busca de um usuário com o endereço de e-mail principal correspondente ao e-mail no perfil de usuário do IdP:

* Se tal usuário for encontrado, o `hashedPassword` campo é eliminado para desativar a autenticação local, e o `samlIdentifiers` campo é adicionado.
* Se não for encontrado nenhum utilizador correspondente, um novo utilizador é criado com o endereço de e-mail e `samlIdentifiers` do perfil do IdP.

**Nota:** Atualmente, apenas um IdP SAML é suportado. O `providerId` campo em `samlIdentifiers` está definido como `'1'`.

#### Variáveis de ambiente

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * Nome de exibição do serviço de identidade, usado na página de login (padrão: `Iniciar sessão com IdP SAML`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * O valor desse atributo será usado pelo Overleaf como o ID de usuário externo, o padrão é `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * Nome do campo Email no perfil do utilizador, o valor predefinido é `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * Nome do campo firstName no perfil do utilizador, o valor predefinido é `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * Nome do campo lastName no perfil do utilizador, o valor predefinido é `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * Se definido como `true`, atualiza o campo do usuário `first_name` e `last_name` campo no início de sessão e desative o formulário de detalhes do utilizador em `/user/settings` página.
* `OVERLEAF_SAML_ENTRYPOINT` **(obrigatório)**
  * URL de entrada do serviço de identidade SAML.
    * Exemplo: `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
    * Exemplo do Azure: `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
* `OVERLEAF_SAML_ISSUER` **(obrigatório)**
  * Nome do emissor.
* `OVERLEAF_SAML_AUDIENCE`
  * Audiência esperada da resposta SAML, o valor predefinido é o valor de `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(obrigatório)**
  * Caminho para um ficheiro que contém o certificado público do Provedor de Identidade, usado para validar as assinaturas das respostas SAML recebidas. Se o Provedor de Identidade tiver vários certificados de assinatura válidos, então pode ser uma matriz JSON de caminhos para os certificados.
    * Exemplo (um certificado): `/var/lib/overleaf/certs/idp_cert.pem`
    * Exemplo (vários certificados): `["var/lib/overleaf/certs/idp_cert.pem", "/var/lib/overleaf/certs/idp_cert_old.pem"]`
* `OVERLEAF_SAML_PUBLIC_CERT`
  * Caminho para um ficheiro que contém o certificado público de assinatura usado para incorporar em pedidos de autenticação, para que o IdP valide as assinaturas do Pedido SAML recebido. É necessário ao configurar o [ponto final de metadados](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider) quando a estratégia é configurada com um `OVERLEAF_SAML_PRIVATE_KEY`. Pode ser fornecida uma matriz JSON de caminhos para certificados para suportar a rotação de certificados. Ao fornecer uma matriz de certificados, a primeira entrada da matriz deve corresponder ao certificado atual `OVERLEAF_SAML_PRIVATE_KEY`. As entradas adicionais na matriz podem ser usadas para publicar certificados futuros aos IdPs antes de alterar o `OVERLEAF_SAML_PRIVATE_KEY`.
* `OVERLEAF_SAML_PRIVATE_KEY`
  * Caminho para um ficheiro que contém uma chave privada em formato PEM correspondente ao `OVERLEAF_SAML_PUBLIC_CERT` usado para assinar pedidos de autenticação enviados por passport-saml.
* `OVERLEAF_SAML_DECRYPTION_CERT`
  * Caminho para um ficheiro que contém o certificado público, usado para o [ponto final de metadados](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider).
* `OVERLEAF_SAML_DECRYPTION_PVK`
  * Caminho para um ficheiro que contém a chave privada correspondente ao `OVERLEAF_SAML_DECRYPTION_CERT` que será usada para tentar desencriptar quaisquer afirmações encriptadas recebidas.
* `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
  * Opcionalmente, defina o algoritmo de assinatura para assinar pedidos; os valores válidos são 'sha1' (predefinido), 'sha256' (preferido), 'sha512' (o mais seguro, verifique se o seu IdP o suporta).
* `OVERLEAF_SAML_ADDITIONAL_PARAMS`
  * Dicionário JSON de parâmetros de consulta adicionais a adicionar a todos os pedidos.
* `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
  * Dicionário JSON de parâmetros de consulta adicionais a adicionar a pedidos de 'authorize'.
    * Exemplo: `{"some_key": "some_value"}`
* `OVERLEAF_SAML_IDENTIFIER_FORMAT`
  * Formato do identificador de nome a solicitar ao fornecedor de identidade (predefinição: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). Se usar `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`, certifique-se de que a `OVERLEAF_SAML_EMAIL_FIELD` variável de ambiente está definida. Se `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` for necessário, também deve definir a `OVERLEAF_SAML_ID_FIELD` variável de ambiente, que pode, por exemplo, ser definida para o endereço de e-mail do utilizador.
* `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
  * Tempo, em milissegundos, de desvio aceitável entre o cliente e o servidor ao verificar os carimbos de data/hora de validade das condições de afirmação OnBefore e NotOnOrAfter. Definir para -1 desativará por completo a verificação destas condições. O valor predefinido é 0.
* `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
  * `AttributeConsumingServiceIndex` atributo a adicionar ao AuthnRequest para instruir o IdP sobre qual conjunto de atributos anexar à resposta ([ligação](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
* `OVERLEAF_SAML_AUTHN_CONTEXT`
  * Matriz JSON de valores de formato do identificador de nome para solicitar o contexto de autenticação. Predefinição: `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
* `OVERLEAF_SAML_FORCE_AUTHN`
  * Se `true`, o pedido SAML inicial do fornecedor de serviços especifica que o IdP deve forçar a reautenticação do utilizador, mesmo que este possua uma sessão válida.
* `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
  * Se `true`, não solicite um contexto de autenticação específico. Por exemplo, pode usar isto para `true` para permitir contextos adicionais, como inícios de sessão sem palavra-passe (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). O suporte para contextos adicionais depende do seu IdP.
* `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
  * Se definido como `HTTP-POST`, solicitará autenticação ao IdP através da ligação HTTP POST; caso contrário, o valor predefinido é HTTP-Redirect.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * Se `always`, então InResponseTo será validado nas respostas SAML recebidas.
  * Se `nunca`, então InResponseTo não será validado (predefinição).
  * Se `ifPresent`, então InResponseTo só será validado se estiver presente na resposta SAML recebida.
* `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` e `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
  * Quando definido como `true` (predefinição), o Overleaf espera que as asserções SAML, respetivamente toda a resposta de autenticação SAML, sejam assinadas pelo IdP. Quando ambas as opções estão `false`, pelo menos uma das asserções ou a resposta tem de estar assinada.
* `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
  * Define o tempo de expiração após o qual um Request ID gerado para um pedido SAML deixa de ser válido se for visto numa resposta SAML no campo `InResponseTo` campo. Predefinição: 28800000 (8 horas).
* `OVERLEAF_SAML_LOGOUT_URL`
  * endereço base a chamar com pedidos de logout (predefinição: `entryPoint`).
    * Exemplo: `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
* `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
  * Dicionário JSON de parâmetros de consulta adicionais a adicionar a pedidos de 'logout'.
* `OVERLEAF_SAML_IS_ADMIN_FIELD` e `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
  * Quando ambas as variáveis de ambiente estão definidas, o processo de início de sessão atualiza `user.isAdmin = true` se o perfil devolvido pelo IdP SAML contiver o atributo especificado por `OVERLEAF_SAML_IS_ADMIN_FIELD` e o respetivo valor corresponder a `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` ou for uma matriz que contenha `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`, caso contrário `user.isAdmin` estiver definido como `false`. Se qualquer uma destas variáveis não estiver definida, então o estado de administrador só é definido como `true` durante a criação de um utilizador administrador no Launchpad.

**Metadados para o Provedor de Identidade**

A versão atual do Overleaf CE inclui um ponto final para obter os metadados do fornecedor de serviços: `http://my-overleaf-instance.com/saml/meta`

O Provedor de Identidade terá de ser configurado para reconhecer o servidor Overleaf como um "Fornecedor de Serviços". Consulte a documentação do seu servidor SAML para obter instruções sobre como fazer isto.

Abaixo está um exemplo de metadados adequados do fornecedor de serviços:

<details>

<summary><strong>ol-meta.xml</strong></summary>

```
<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
                  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                  entityID="MyOverleaf"
                  ID="_b508c83b7dda452f5b269383fb391107116f8f57">
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true" WantAssertionsSigned="true">
    <KeyDescriptor use="signing">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes256-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes128-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
    </KeyDescriptor>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                         Location="https://my-overleaf-instance.com/saml/logout/callback"/>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <AssertionConsumerService index="1"
                              isDefault="true"
                              Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                              Location="https://my-overleaf-instance.com/saml/login/callback"/>
  </SPSSODescriptor>
</EntityDescriptor>

```

</details>

Observe os certificados, `AssertionConsumerService.Location`, `SingleLogoutService.Location` e `EntityDescriptor.entityID` e configure-os conforme apropriado na configuração do seu IdP, ou envie o ficheiro de metadados ao administrador do IdP.

<details>

<summary><strong>Ficheiro de exemplo variables.env (mínimo)</strong></summary>

<pre><code>OVERLEAF_APP_NAME="A nossa instância Overleaf"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Ativa a geração de miniaturas usando ImageMagick
ENABLE_CONVERSIONS=true

# Desativa a exigência de confirmação de email
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## Definir para TLS via nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=A nossa instância Overleaf
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com

OVERLEAF_LEFT_FOOTER=[{"text": "Contacte a sua equipa de suporte", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Olá, estou à direita", "url":"https://github.com/yu-i-i/overleaf-cep"}]

OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=Este sistema é gerido pelo departamento x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
##     SAML    ##
#################

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='Iniciar sessão com o fornecedor SAML'
OVERLEAF_SAML_EMAIL_FIELD=Email
OVERLEAF_SAML_FIRST_NAME_FIELD=DisplayName
OVERLEAF_SAML_LAST_NAME_FIELD=DisplayName
OVERLEAF_SAML_ENTRYPOINT=http://localhost:18000/login/saml/authorize/admin/SAML_Overleaf
<strong>OVERLEAF_SAML_IDP_CERT=/var/lib/overleaf/certs/idp_cert.pem
</strong>OVERLEAF_SAML_SIGNATURE_ALGORITHM=
</code></pre>

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/pt/configuracao/overleaf-toolkit/authentication/saml-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
