Configurando a autenticação do SDK
A autenticação do SDK permite fornecer prova criptográfica (gerada no lado do servidor) para solicitações do SDK feitas em nome de usuários registrados.
Como funciona?
Depois de ativar este recurso em seu app, você pode configurar o dashboard do Braze para rejeitar quaisquer solicitações com um JSON Web Token (JWT) inválido ou ausente, que inclui:
- Envio de eventos personalizados, atributos, compras e dados de sessão
- Criação de novos usuários em seu espaço de trabalho no Braze
- Atualização das atribuições do perfil de usuário padrão
- Receber ou disparar mensagens
Agora é possível impedir que usuários registrados não autenticados usem a chave de API SDK do seu app para executar ações mal-intencionadas, como simulação de outros usuários.
Configurando a autenticação
Etapa 1: Configure seu servidor
Etapa 1.1: Gerar um par de chaves públicas/privadas
Gerar um par de chaves públicas/privadas RSA256. A chave pública será eventualmente adicionada ao dashboard da Braze, enquanto a chave privada deverá ser armazenada com segurança em seu servidor.
Recomendamos usar uma chave de RSA com 2048 bits para uso com o algoritmo RS256 JWT.
Lembre-se de manter suas chaves privadas em sigilo. Nunca exponha ou codifique sua chave privada em seu app ou site. Qualquer pessoa que conheça sua chave privada pode fazer simulação ou criar usuários em nome do seu aplicativo.
Etapa 1.2: Crie um JSON Web Token para o usuário atual
Depois de obter a chave privada, o aplicativo no lado do servidor deve usá-la para retornar um JWT ao seu app ou site para o usuário atualmente registrado.
Normalmente, essa lógica pode ser acessada em qualquer lugar em que o aplicativo normalmente solicite o perfil do usuário atual, como um endpoint de login ou em qualquer lugar em que o aplicativo atualize o perfil do usuário atual.
Ao gerar o JWT, os seguintes campos são esperados:
Cabeçalho JWT
Campo | Obrigatória | Descrição |
---|---|---|
alg |
Sim | O algoritmo suportado é RS256 . |
typ |
Sim | O tipo deve ser igual a JWT . |
Carga útil do JWT
Campo | Obrigatória | Descrição |
---|---|---|
sub |
Sim | O “assunto” deve ser igual ao ID de usuário que você forneceu ao SDK da Braze ao chamar changeUser |
exp |
Sim | A “expiração” de quando você deseja que esse token expire. |
Para saber mais sobre os tokens da Web JSON ou para navegar pelas muitas bibliotecas de código aberto que simplificam esse processo de fazer login, consulte https://jwt.io.
Etapa 2: Configurar o SDK
Esse recurso está disponível a partir das seguintes versões do SDK:
Para integrações de iOS, esta página detalha as etapas para a Braze Swift SDK. Para obter exemplos de uso no AppboyKit iOS SDK legado, consulte este arquivo e este arquivo.
Etapa 2.1: Ative a autenticação no SDK do Braze.
Quando essa capacitação for ativada, o SDK da Braze anexará o último JWT conhecido do usuário atual às solicitações de rede feitas aos Braze Currents.
Não se preocupe, a inicialização apenas com essa opção não afetará a coleta de dados de forma alguma, até que você comece a aplicar a autenticação no dashboard do Braze.
Ao chamar initialize
, defina a propriedade opcional enableSdkAuthentication
como true
.
1
2
3
4
5
import * as braze from"@braze/web-sdk";
braze.initialize("YOUR-API-KEY-HERE", {
baseUrl: "YOUR-SDK-ENDPOINT-HERE",
enableSdkAuthentication: true,
});
Ao configurar a instância do Braze, chame setIsSdkAuthenticationEnabled
para true
.
1
2
3
BrazeConfig.Builder brazeConfigBuilder = new BrazeConfig.Builder()
.setIsSdkAuthenticationEnabled(true);
Braze.configure(this, brazeConfigBuilder.build());
Como alternativa, você pode adicionar <bool name="com_braze_sdk_authentication_enabled">true</bool>
ao seu braze.xml.
Ao configurar a instância do Braze, chame setIsSdkAuthenticationEnabled
para true
.
1
2
3
BrazeConfig.Builder brazeConfigBuilder = BrazeConfig.Builder()
.setIsSdkAuthenticationEnabled(true)
Braze.configure(this, brazeConfigBuilder.build())
Como alternativa, você pode adicionar <bool name="com_braze_sdk_authentication_enabled">true</bool>
ao seu braze.xml.
Para ativar a autenticação do SDK, defina a propriedade configuration.api.sdkAuthentication
de seu objeto BRZConfiguration
como YES
antes de inicializar a instância da Braze:
1
2
3
4
5
6
BRZConfiguration *configuration =
[[BRZConfiguration alloc] initWithApiKey:@"{BRAZE_API_KEY}"
endpoint:@"{BRAZE_ENDPOINT}"];
configuration.api.sdkAuthentication = YES;
Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
AppDelegate.braze = braze;
Para ativar a autenticação do SDK, defina a propriedade configuration.api.sdkAuthentication
de seu objeto Braze.Configuration
como true
ao inicializar o SDK:
1
2
3
4
5
let configuration = Braze.Configuration(apiKey: "{YOUR-BRAZE-API-KEY}",
endpoint: "{YOUR-BRAZE-ENDPOINT}")
configuration.api.sdkAuthentication = true
let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
Atualmente, a autenticação do SDK deve ser ativada como parte da inicialização do SDK no código nativo do iOS e do Android. Para ativar a autenticação do SDK no Flutter SDK, siga as integrações para iOS e Android nas outras guias. Depois que a autenticação do SDK for ativada, o restante do recurso poderá ser integrado ao Dart.
Etapa 2.2: Defina o JWT do usuário atual
Sempre que seu app chamar o método changeUser
do Braze, forneça também o JWT que foi gerado no servidor.
Também é possível configurar o token para ser atualizado no meio da sessão para o usuário atual.
Lembre-se de que o endereço changeUser
só deve ser chamado quando a ID do usuário for realmente alterada. Você não deve usar este método como uma forma de atualizar o token de autenticação (JWT) se o ID do usuário não tiver mudado.
Forneça o JWT ao chamar changeUser
:
1
2
import * as braze from "@braze/web-sdk";
braze.changeUser("NEW-USER-ID", "JWT-FROM-SERVER");
Ou quando você atualiza o token do usuário no meio da sessão:
1
2
import * as braze from"@braze/web-sdk";
braze.setSdkAuthenticationSignature("NEW-JWT-FROM-SERVER");
Forneça o JWT ao chamar changeUser
:
1
Braze.getInstance(this).changeUser("NEW-USER-ID", "JWT-FROM-SERVER");
Ou quando você atualiza o token do usuário no meio da sessão:
1
Braze.getInstance(this).setSdkAuthenticationSignature("NEW-JWT-FROM-SERVER");
Forneça o JWT ao chamar changeUser
:
1
Braze.getInstance(this).changeUser("NEW-USER-ID", "JWT-FROM-SERVER")
Ou quando você atualiza o token do usuário no meio da sessão:
1
Braze.getInstance(this).setSdkAuthenticationSignature("NEW-JWT-FROM-SERVER")
Forneça o JWT ao chamar changeUser
:
1
[AppDelegate.braze changeUser:@"userId" sdkAuthSignature:@"JWT-FROM-SERVER"];
Ou quando você atualiza o token do usuário no meio da sessão:
1
[AppDelegate.braze setSDKAuthenticationSignature:@"NEW-JWT-FROM-SERVER"];
Forneça o JWT ao chamar changeUser
:
1
AppDelegate.braze?.changeUser(userId: "userId", sdkAuthSignature: "JWT-FROM-SERVER")
Ou quando você atualiza o token do usuário no meio da sessão:
1
AppDelegate.braze?.set(sdkAuthenticationSignature: "NEW-JWT-FROM-SERVER")
Forneça o JWT ao chamar changeUser
:
1
braze.changeUser("userId", sdkAuthSignature: "JWT-FROM-SERVER")
Ou quando você atualiza o token do usuário no meio da sessão:
1
braze.setSdkAuthenticationSignature("NEW-JWT-FROM-SERVER")
Etapa 2.3: Registre uma função de retorno de chamada para tokens inválidos
Quando esse recurso for definido como Obrigatório, os cenários a seguir farão com que as solicitações de SDK sejam rejeitadas pelo Braze:
- O JWT expirou no momento em que foi recebido pela API do Braze
- O JWT estava vazio ou ausente
- Falha na verificação do JWT para as chaves públicas que você fez upload para o dashboard da Braze
Você pode usar o site subscribeToSdkAuthenticationFailures
para se inscrever e ser notificado quando as solicitações do SDK falharem por um desses motivos. Uma função de retorno de chamada contém um objeto com o errorCode
relevante, reason
para o erro, o userId
da solicitação (se o usuário não for anônimo) e o token de autenticação (JWT) que causou o erro.
As solicitações com falha serão repetidas periodicamente até que seu app forneça um novo JWT válido. Se o usuário ainda estiver registrado, você poderá usar esse retorno de chamada como uma oportunidade para solicitar um novo JWT do seu servidor e fornecer ao SDK do Braze esse novo token válido.
Esses métodos de retorno de chamada são um ótimo lugar para adicionar seu próprio serviço de monitoramento ou registro de erros para saber com que frequência as solicitações do Braze estão sendo rejeitadas.
1
2
3
4
5
6
7
import * as braze from"@braze/web-sdk";
braze.subscribeToSdkAuthenticationFailures((error) => {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
const updated_jwt = await getNewTokenSomehow(error);
braze.setSdkAuthenticationSignature(updated_jwt);
});
1
2
3
4
5
6
Braze.getInstance(this).subscribeToSdkAuthenticationFailures(error -> {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the error user matches the currently logged-in user
String newToken = getNewTokenSomehow(error);
Braze.getInstance(getContext()).setSdkAuthenticationSignature(newToken);
});
1
2
3
4
5
6
Braze.getInstance(this).subscribeToSdkAuthenticationFailures({ error: BrazeSdkAuthenticationErrorEvent ->
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
val newToken: String = getNewTokenSomehow(error)
Braze.getInstance(getContext()).setSdkAuthenticationSignature(newToken)
})
1
2
3
4
5
6
7
8
9
10
11
12
Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
braze.sdkAuthDelegate = delegate;
AppDelegate.braze = braze;
// Method to implement in delegate
- (void)braze:(Braze *)braze sdkAuthenticationFailedWithError:(BRZSDKAuthenticationError *)error {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
NSLog(@"Invalid SDK Authentication Token.");
NSString *newSignature = getNewTokenSomehow(error);
[AppDelegate.braze setSDKAuthenticationSignature:newSignature];
}
1
2
3
4
5
6
7
8
9
10
11
12
let braze = Braze(configuration: configuration)
braze.sdkAuthDelegate = delegate
AppDelegate.braze = braze
// Method to implement in delegate
func braze(_ braze: Braze, sdkAuthenticationFailedWithError error: Braze.SDKAuthenticationError) {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
print("Invalid SDK Authentication Token.")
let newSignature = getNewTokenSomehow(error)
AppDelegate.braze?.set(sdkAuthenticationSignature: newSignature)
}
1
2
3
4
5
6
7
braze.setBrazeSdkAuthenticationErrorCallback((BrazeSdkAuthenticationError error) async {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
print("Invalid SDK Authentication Token.")
let newSignature = getNewTokenSomehow(error)
braze.setSdkAuthenticationSignature(newSignature);
});
Etapa 3: Ative a autenticação no dashboard
Em seguida, você pode ativar a autenticação no dashboard do Braze para os apps que você configurou anteriormente.
Lembre-se de que as solicitações de SDK continuarão a fluir normalmente sem autenticação, a menos que a configuração de autenticação do SDK do app esteja definida como Obrigatória no dashboard da Braze.
Se algo der errado com sua integração (por exemplo, seu app está passando tokens incorretamente para o SDK ou seu servidor está gerando tokens inválidos), desative esse recurso no dashboard do Braze e os dados voltarão a fluir normalmente sem verificação.
Opções de aplicação
Na página Manage Settings (Configurações de gerenciamento) do dashboard, cada app tem três estados de autenticação do SDK que controlam como a Braze verifica as solicitações.
Configuração | Descrição |
---|---|
Desativado | O Braze não verificará o JWT fornecido para um usuário. (Configuração padrão) |
Opcional | A Braze verificará as solicitações de usuários registrados, mas não rejeitará solicitações inválidas. |
Obrigatória | O Braze verificará as solicitações de usuários registrados e rejeitará JWTs inválidos. |
A configuração Opcional é uma maneira útil de monitorar o impacto potencial que esse recurso terá no tráfego do SDK do seu app.
Um JWT inválido será relatado em ambos os estados Opcional e Obrigatório, no entanto, apenas o estado Obrigatório rejeitará solicitações do SDK, fazendo com que os apps tentem novamente e solicitem um novo JWT.
Gerenciamento de chaves públicas
Adição de uma chave pública
Você pode adicionar até três chaves públicas para cada app: uma primária, uma secundária e uma terciária. Você também pode adicionar a mesma chave a mais de um app, se necessário. Para adicionar uma chave pública:
- Acesse o dashboard da Braze e selecione (Configurações > Configurações do app).
- Escolha um aplicativo da sua lista de aplicativos disponíveis.
- Em Autenticação do SDK, selecione Adicionar chave pública.
- Insira uma descrição opcional, cole sua chave pública e selecione Adicionar chave pública.
Atribuir uma nova chave primária
Para atribuir uma chave secundária ou terciária como sua nova chave primária:
- Acesse o dashboard da Braze e selecione (Configurações > Configurações do app).
- Escolha um aplicativo da sua lista de aplicativos disponíveis.
- Em Autenticação do SDK, escolha uma chave e selecione Gerenciar > Tornar chave primária.
Exclusão de uma tecla
Para excluir uma chave primária, primeiro atribua uma nova primária e, em seguida, exclua sua chave. Para excluir uma chave não primária:
- Acesse o dashboard da Braze e selecione (Configurações > Configurações do app).
- Escolha um aplicativo da sua lista de aplicativos disponíveis.
- Em Autenticação do SDK, escolha uma chave não primária e selecione Gerenciar > Excluir chave pública.
Análise de dados
Cada app mostrará um detalhamento dos erros de autenticação do SDK coletados enquanto esse recurso estiver no estado Opcional e Obrigatório.
Os dados estão disponíveis em tempo real, e você pode passar o mouse sobre os pontos do gráfico para ver um detalhamento dos erros de uma determinada data.
Códigos de erro
Código de erro | Motivo do erro | Descrição |
---|---|---|
10 | EXPIRATION_REQUIRED |
A expiração é um campo obrigatório para o uso do Braze. |
20 | DECODING_ERROR |
Chave pública não correspondente ou um erro geral não detectado. |
21 | SUBJECT_MISMATCH |
Os assuntos esperados e os reais não são os mesmos. |
22 | EXPIRED |
O token fornecido expirou. |
23 | INVALID_PAYLOAD |
A carga útil do token é inválida. |
24 | INCORRECT_ALGORITHM |
O algoritmo do token não é compatível. |
25 | PUBLIC_KEY_ERROR |
A chave pública não pôde ser convertida no formato adequado. |
26 | MISSING_TOKEN |
Nenhum token foi fornecido na solicitação. |
27 | NO_MATCHING_PUBLIC_KEYS |
Nenhuma chave pública corresponde ao token fornecido. |
28 | PAYLOAD_USER_ID_MISMATCH |
Nem todos os IDs de usuário na carga útil da solicitação correspondem ao que é necessário. |
Perguntas Frequentes (FAQ)
Esse recurso precisa ser ativado em todos os meus aplicativos ao mesmo tempo?
Não, esse recurso pode ser ativado para aplicativos específicos e não precisa ser usado em todos os seus aplicativos, de uma só vez.
O que acontece com os usuários que ainda estão em versões mais antigas do meu app?
Quando você começar a aplicar esse recurso, as solicitações feitas por versões mais antigas do app serão rejeitadas pela Braze e tentadas novamente pelo SDK. Depois que os usuários fizerem upgrade do app para uma versão compatível, essas solicitações enfileiradas começarão a ser aceitas novamente.
Se possível, empurre os usuários para fazer o upgrade como faria para qualquer outra atualização obrigatória. Como alternativa, você pode manter o recurso opcional até perceber que uma porcentagem aceitável de usuários fez upgrade.
Qual expiração devo usar ao gerar um JWT?
Recomendamos usar o valor mais alto de duração média da sessão, expiração do cookie/token da sessão ou a frequência com que o aplicativo atualizaria o perfil do usuário atual.
O que acontece se um JWT expirar no meio da sessão de um usuário?
Se o token de um usuário expirar no meio da sessão, o SDK possui uma função de retorno de chamada que será invocada para informar ao seu app que um novo JWT é necessário para continuar enviando dados para o Braze.
O que acontecerá se minha integração lado a lado com o servidor falhar e eu não puder mais criar um JWT?
Se seu servidor não conseguir fornecer um JWT ou se você notar algum problema de integração, você sempre pode desativar o recurso no dashboard do Braze.
Uma vez desativada, todas as solicitações pendentes do SDK que falharem serão eventualmente repetidas pelo SDK e aceitas pela Braze.
Por que esse recurso usa chaves públicas/privadas em vez de segredos compartilhados?
Ao usar segredos compartilhados, qualquer pessoa com acesso a esse segredo compartilhado, como a página do dashboard do Braze, poderá gerar tokens e se passar por seus usuários finais.
Em vez disso, usamos chaves públicas/privadas para que nem mesmo os Colaboradores do Braze (muito menos os usuários do seu dashboard) tenham acesso às suas chaves privadas.
Como as solicitações rejeitadas serão tentadas novamente?
Quando uma solicitação é rejeitada devido a um erro de autenticação, o SDK invocará seu retorno de chamada usado para atualizar o JWT do usuário.
As solicitações serão repetidas periodicamente usando uma abordagem de backoff exponencial. Após 50 tentativas consecutivas sem sucesso, as novas tentativas serão pausadas até o início da próxima sessão. Cada SDK também tem um método para solicitar manualmente uma descarga de dados.