> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Visão geral do Generate JWT

> Gere uma URL de vinculação de rede social para um user profile.

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["business"]} maxPackRequired={false} />

O [endpoint generateJWT](/apis/profiles/generate-jwt) gera uma URL de vinculação de rede social para um único User Profile.
Consulte a [integração da API do Business Plan e Launch Plan](/multiple-users/api-integration-business) para mais detalhes.

## Alternar entre profiles

Para alternar entre diferentes sessões de profile (por exemplo, ao testar com múltiplos profiles), você precisa fazer logout do profile atual primeiro. Consulte [Logout automático de uma sessão de profile](/multiple-users/api-integration-business#automatic-logout-of-a-profile-session) para instruções sobre como lidar corretamente com a troca de profiles.

## Private Key e Profile Key

### Onde obter a Private Key

O arquivo da Private Key (private.key) e um arquivo JSON de exemplo do Postman estão incluídos no seu [Integration Package](/multiple-users/api-integration-business#integration-package) recebido durante o onboarding.
O Integration Package também pode ser obtido no painel de desenvolvedor do Ayrshare, na página da API -> Integration Package.

### Usando a Private Key

Recomendamos ler a Private Key private.key de um arquivo e enviá-la como string no campo `privateKey`, o que permite preservar todos os caracteres, incluindo quebras de linha.
A Private Key deve ser precisa, ou seja, preservar todos os caracteres, incluindo quebras de linha.
Se você colar a chave em seu código, pode ser necessário substituir manualmente as quebras de linha por um caractere `\n` ou codificar a string em URL.

Colar a chave diretamente no código frequentemente causa problemas.

## Gerar um JSON Web Token

Vídeo de 1 minuto explicando como gerar um JSON Web Token (JWT):

<div class="video-container">
  <iframe width="380" height="200" src="https://www.youtube.com/embed/JI232HBWHWc" title="Generate a JSON Web Token" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" />
</div>

A URL do JWT é válida por **5 minutos**. Após 5 minutos, você deve gerar uma nova URL de JWT.
Consulte [Max Pack `expiresIn`](/apis/profiles/generate-jwt-overview#jwt-expires-in) para opções adicionais.

## Abrir a URL do JWT

Abra a URL do JWT em uma nova aba do navegador, nova janela do navegador ou View Controller no iOS.

Você pode controlar o [fechamento ou redirecionamento](/multiple-users/api-integration-business#opening-and-closing-the-social-linking-url) da nova janela ou aba.

<Note>
  As redes sociais não permitem abrir a URL em um iFrame nem ofuscar o domínio de origem aprovado do parceiro
  profile.ayrshare.com.
</Note>

## Verificar a URL do JWT

O endpoint `generateJWT` não valida a URL do JWT retornada por padrão.
Por exemplo, se uma Private Key corrompida for passada para o `generateJWT`, uma URL ainda será retornada e a URL resultará em um erro 401.

Você pode verificar a URL do JWT retornada incluindo `verify: true` nos parâmetros do corpo de `generateJWT`. Se a URL do JWT não puder ser validada, um erro será retornado. Por exemplo, se a Private Key tiver um caractere removido, o seguinte será retornado:

```json JWT Error theme={"system"}
{
  "action": "JWT",
  "status": "error",
  "code": 189,
  "message": "Error generating JWT. Check the sent parameters, such as the privateKey has no extra tabs, spaces, or newlines. Also the entire private.key file including -----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATE KEY-----. Error: secretOrPrivateKey must be an asymmetric key when using RS256"
}
```

Recomendamos usar `verify: true` apenas em ambientes fora de produção, pois a validação consome tempo de processamento adicional.

## Testando no Postman

É **recomendado** testar primeiro a criação da URL do JWT no [Postman](/testing/postman).
Incluído no Integration Package, encontrado na página da API Key do Primary Profile no painel, há um arquivo JSON de configuração de exemplo para o Postman que traz tudo o que você precisa para verificar a criação da URL do JWT.
Basta importar o arquivo de configuração no Postman, preencher seu Profile Key (encontrado no painel de desenvolvedor do Ayrshare alternando para o profile que deseja testar) no campo *body* `profileKey` e clicar no botão azul *Send*.
Todos os outros campos obrigatórios já estão preenchidos.

Você também pode [gerar o código a partir do Postman](/testing/postman#auto-generate-api-code-with-postman), ou ler o arquivo da chave de um diretório ou banco de dados.

## Método de vinculação do Instagram

Contas do Instagram podem ser vinculadas de [duas formas](/dashboard/connect-social-accounts/instagram): diretamente via **Instagram Login** ou por meio de uma **Página do Facebook conectada**.
Qual fluxo será iniciado quando um usuário clicar no botão do Instagram na página de vinculação de contas sociais normalmente é controlado pela configuração de [Instagram Login](/multiple-users/manage-user-profiles#instagram-login) em nível de conta no painel.

O parâmetro do corpo `instagramLinkMethod` do [endpoint generateJWT](/apis/profiles/generate-jwt) permite sobrescrever essa configuração para uma única URL de vinculação:

| Valor       | Fluxo de vinculação do Instagram                                 |
| ----------- | ---------------------------------------------------------------- |
| `instagram` | Instagram Login direto. Não é necessária uma Página do Facebook. |
| `facebook`  | Vincular por meio de uma Página do Facebook conectada.           |

Por exemplo, se o padrão da sua conta for vinculação via Página do Facebook, o seguinte força o Instagram Login direto apenas para esta sessão de vinculação:

```json Instagram Link Method theme={"system"}
{
  "instagramLinkMethod": "instagram"
}
```

A URL do JWT gerada incluirá o override, e clicar no botão do Instagram na página de vinculação iniciará o fluxo solicitado durante toda a sessão — incluindo o redirecionamento de autorização do Instagram/Facebook.

Algumas coisas a saber:

* O override se aplica somente à página de vinculação aberta a partir da URL retornada. Ele não altera a configuração de Instagram Login em nível de conta nem afeta outras sessões de vinculação.
* Se `instagramLinkMethod` for omitido, a página de vinculação usa sua configuração em nível de conta, exatamente como antes.
* Se um valor inválido for enviado, um erro `400` será retornado listando os valores válidos (`instagram`, `facebook`).
* Revise as [diferenças entre os recursos](/multiple-users/manage-user-profiles#direct-instagram-login-vs-facebook-page-authentication) dos dois fluxos antes de escolher um override — alguns recursos do Instagram, como pesquisa de hashtag e colaborações, estão disponíveis apenas com a autenticação via Página do Facebook.

## JWT Expires In

<PlansAvailable plans={["business"]} maxPackRequired />

Se você quiser um timeout do JWT maior que os 5 minutos padrão, inclua o campo `expiresIn`.

Por exemplo, envie o seguinte JSON para definir a URL do JWT como válida por 30 minutos:

```json JWT Expires In theme={"system"}
{
  "expiresIn": 30
}
```

Isso permite que você [envie o link por e-mail](/apis/profiles/generate-jwt-overview#connect-accounts-email) aos seus usuários em vez de eles precisarem acessar seu aplicativo ou plataforma.
Um caso de uso comum é quando seu usuário precisa reconectar uma conta social: você pode enviar o link do JWT por e-mail para reconectar diretamente a conta social, sem precisar navegar até sua plataforma.

<Warning>
  Certifique-se de revisar com sua equipe de segurança por quanto tempo sua empresa deseja manter o JWT ativo.
  Tempos de expiração mais longos criam risco adicional de acesso não autorizado ao link.
</Warning>

## Integrações

### JWT no Bubble.io

Se você é um usuário do Bubble, consulte *Generate JWT Token* na seção do Bubble.io para instruções:

<Card title="Bubble Generate JWT" icon="link" href="/packages-guides/bubble#generate-jwt-token-in-bubble" horizontal />

### JWT em mobile

Os seguintes [exemplos de código para mobile](/apis/profiles/generate-jwt-overview#mobile-code-examples) em Swift, Flutter e React Native mostram como iniciar a página de vinculação de contas sociais em um dispositivo iOS.
Substitua a variável String `jwtURL` pelo retorno do [endpoint /generateJWT](/apis/profiles/generate-jwt).

#### Swift (iOS)

Em Swift, use um `UIViewController` e `SFSafariViewControllerDelegate`.
Não recomendamos usar um `WebView`, já que algumas redes sociais, como Facebook e Google, bloqueiam a autenticação.

#### Flutter (Dart)

No Flutter (Dart), não há um equivalente direto a um `UIViewController` ou ao `SFSafariViewController`.
No entanto, você pode obter uma funcionalidade semelhante usando o pacote `url_launcher` para abrir URLs web.

#### React Native

O React Native também não tem um equivalente direto ao `SFSafariViewController`, mas você pode obter um resultado semelhante com a API `WebBrowser` fornecida pelo `expo-web-browser`, que abre uma URL em uma janela modal do navegador que compartilha cookies com o navegador do sistema. Como alternativa, você pode usar a função `Linking` nativa do React Native para abrir o Safari: `await Linking.canOpenURL(jwtURL);`

#### Exemplos de código para mobile

<CodeGroup>
  ```swift Swift theme={"system"}
  import UIKit
  import SafariServices

  class ViewController: UIViewController, SFSafariViewControllerDelegate {
      
      var jwtURL = "https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ"

      override func viewDidLoad() {
          super.viewDidLoad()
          setupButton()
      }
      
      func setupButton() {
          let button = UIButton(type: .system)
          button.frame = CGRect(x: (view.bounds.width - 200) / 2, y: (view.bounds.height - 50) / 2, width: 200, height: 50)
          button.setTitle("Open URL", for: .normal)
          button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
          view.addSubview(button)
      }

      @objc func buttonTapped() {
          openURLInInAppBrowser()
      }

      func openURLInInAppBrowser() {
          if let url = URL(string: jwtURL) {
              let safariVC = SFSafariViewController(url: url)
              safariVC.delegate = self
              present(safariVC, animated: true, completion: nil)
          }
      }

      // Optional: If you want to handle when the in-app browser is closed
      func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
          controller.dismiss(animated: true, completion: nil)
      }
  }
  ```

  ```dart Flutter theme={"system"}
  /** yaml dependencies
    dependencies:
      flutter:
        sdk: flutter
      url_launcher: ^6.2.1
  */

  import 'package:flutter/material.dart';
  import 'package:url_launcher/url_launcher.dart';

  void main() {
    runApp(MyApp());
  }

  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'URL Launcher Example',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      );
    }
  }

  class MyHomePage extends StatelessWidget {
    final String jwtURL = "https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ";

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('URL Launcher Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              openURLInBrowser(context);
            },
            child: Text('Open URL'),
          ),
        ),
      );
    }

    void openURLInBrowser(BuildContext context) async {
      if (await canLaunch(jwtURL)) {
        await launch(jwtURL);
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('Could not launch $jwtURL'),
          ),
        );
      }
    }
  }
  ```

  ```jsx React Native theme={"system"}
  /**
  • Using the API provided by expo-web-browser,
  • which opens a URL in a modal browser window that shares cookies
  • with the system browser.

  • Learn more about expo: https://reactnative.dev/docs/environment-setup?guide=quickstart
  • and running the following command:
  • expo install expo-web-browser
  */

  import React from 'react';
  import { StyleSheet, Button, View } from 'react-native';
  import * as WebBrowser from 'expo-web-browser';

  export default function App() {
    const jwtURL = 'https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ';

    const openURLInBrowser = async () => {
      try {
        await WebBrowser.openBrowserAsync(jwtURL);
        // Optional: WebBrowser.openBrowserAsync returns a promise that resolves with an object containing
        // 'type' that can be 'cancelled' or 'dismissed'. You can use this to handle when the browser is closed.
      } catch (error) {
        console.error(error);
      }
    };

    return (
      <View style={styles.container}>
        <Button title="Open URL" onPress={openURLInBrowser} />
      </View>
    );
  }

  const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
    },
  });
  ```
</CodeGroup>

## E-mail de conexão de contas

<max_pack />

Em conjunto com a opção de tempo de expiração maior, você também pode fazer com que o Ayrshare envie automaticamente aos seus usuários um e-mail com um link para a página de vinculação de contas sociais.

### JSON de conexão de contas

Por exemplo, o JSON a seguir enviará um e-mail para `john@user.com` com o nome da empresa ACME, e-mail de contato `support@mycompany.com` e links para os termos e política de privacidade:

```json Example Contact Email Request theme={"system"}
/**
  All fields are in the email object required.
  Missing fields will cause the email to fail.
*/
{
  "email": {
    "to": "john@user.com",
    "contactEmail": "support@mycompany.com",
    "company": "ACME",
    "termsUrl": "https://www.ayrshare.com/terms",
    "privacyUrl": "https://www.ayrshare.com/privacy",
    "expiresIn": 60
  }
}
```

A resposta incluirá o seguinte se o e-mail e o tempo de expiração forem definidos:

```json Example Contact Email Response theme={"system"}
{
  "emailSent": true,
  "expiresIn": "30m"
}
```

### Exemplo de e-mail JWT Connect Accounts

Aqui está um exemplo de e-mail com o link Connect Account que abre a página de vinculação de contas sociais:

<img src="https://mintcdn.com/ayrshare-docs/Nmrhj2Gh7WSf62Bh/images/apis/profiles/jwt-email.webp?fit=max&auto=format&n=Nmrhj2Gh7WSf62Bh&q=85&s=fbe4ee86ca59c26a5bd5b289fda96b8b" alt="JWT Email" width="563" class="center" data-path="images/apis/profiles/jwt-email.webp" />

O e-mail virá do endereço:

`Social Connect Hub <connect@socialconnecthub.com>`
