- por que e como passar de segredos a credenciais,
- como usar chaves de API em Ruby, YML e js.erb,
- basta dar a chave para cada um da equipe de uma vez por todas.
Até 3 anos atrás, David Heinemeyer Hansson, o criador do framework Ruby on Rails, tuitou sobre a chegada do Rails 5.2.0, mas novas tecnologias freqüentemente demoram para acelerar e ganhar publicidade.
Isso pode ser considerado uma chamada de alerta se você tiver que manipular chaves de API com muita frequência, trocando-as com outros desenvolvedores de sua equipe. Então é hora de dar uma outra olhada em como você pode usar credenciais em um aplicativo Ruby on Rails.
Por que usar credenciais em vez de segredos?
No ciclo de desenvolvimento, à medida que se desenvolve, mais e mais serviços diferentes são integrados no projeto. Cada serviço externo possui sua própria chave de API. Geralmente, leva muito pouco tempo antes que os colegas comecem a procurar a chave de API mais recente. Isso é muito chato!
Ou imagine que a chave API está sendo atualizada. Cada desenvolvedor da equipe deve atualizar separadamente a chave nos arquivos dotenv locais. Parece que tudo isso não corresponde ao conceito de automação e programação de ideias, certo?
Esqueça a troca de chaves de API em chats do Slack ou e-mail. Você não precisa mais violar sua política de segurança.
As credenciais no Rails resolvem esse problema de maneira simples e eficiente: fazer o upload de chaves para o Github.
Enviando para o Github? Sim, faça upload para o Github! Nota pequena: as chaves de API são totalmente criptografadas.
A grande vantagem dessa abordagem é que há uma única chave para compartilhar com a equipe. E isso nunca muda!
Novas chaves de API adicionadas por seus pares como credenciais são retiradas do Github toda vez que você verifica a versão mais recente do branch principal (anteriormente chamado de "branch master" ).
A chave pode ser encontrada na pasta config / master.key.
Como funciona?
A execução
bin/rails credentials:edit
em trilhos cria dois arquivos que são necessários na pasta config:
credentials.yml.enc
armazena todas as suas chaves de API. Caso você esteja curioso, a extensão .enc significa criptografia.master.key
É a chave usada para descriptografar criptografado.file (1.) Certifique-se de adicionar master.key ao arquivo.gitignore.yml
.
Junto com o repositório, enviamos nosso arquivo
Credentials.yml.enc
para o Github, agora está em boas mãos. Ao mesmo tempo, mantemos master.key conosco e como se nossa vida dependesse disso!
Mudando para credenciais
Abra o arquivo de credenciais fazendo o seguinte em um terminal:
EDITOR='code --wait' bin/rails credentials:edit
Dependendo do editor que você está usando, substitua
code
(Código VS). Por exemplo:
vim ou vi = Vim
atom = Atom
subl ou stt = Sublime
O arquivo de credenciais é aberto automaticamente no editor e espera que você o atualize e feche novamente. Mova as chaves ENV que você usa no arquivo .env para o arquivo credentials.yml.
Substitua o arquivo antigo
.ENV
:
STRIPE_PUBLISHABLE_KEY=pk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00t
STRIPE_SECRET_KEY=sk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00tgAAYF
STRIPE_WEBHOOK_SECRET_KEY=whsec_cZpB0VG8cZpB0VG8cZpB0VG8UrgA2gcZpB0VG8cZpB
CLOUDINARY_URL=cloudinary://15031853100444:XOr3XQ-DcZ4dBoan80@DcZ4Boan800U
GOOGLE_API_KEY=S3cAOJVy0WyS3cAOJVy0WyIR9AOJVy0WyIR92e
em
credentials.yml
:
stripe:
publishable_key: pk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00tgAAYF
secret_key: sk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00tgAAYF
web_hook_secret_key: whsec_cZpB0VG8cZpB0VG8cZpB0VG8UrgA2gcZpB0VG8cZpB
google_api_key: S3cAOJVy0WyS3cAOJVy0WyIR9AOJVy0WyIR92e
cloudinary:
cloud_name: abcdefg
api_key: 12345678910
api_secret: abc315-VG8Ll8VG8Ll8L
Nota: A Cloudinary API Key é dividida em várias partes de acordo com a documentação.
Está tudo pronto! Para exibição, as credenciais podem ser executadas em um terminal.
Corra
bin/rails credentials:show
.
É hora de dizer adeus ao nosso velho amigo - o arquivo .ENV. Vamos deletar.
Como usar credenciais em diferentes formatos, como Ruby, YML e JavaScript
Ruby
# nested key
Rails.application.credentials.stripe[:publishable_key]
# single key
Rails.application.credentials.google_api_key
YML
cloudinary: service: Cloudinary api_key: <%= Rails.application.credentials.dig(:cloudinary, :api_key) %> api_secret: <%= Rails.application.credentials.dig(:cloudinary, :api_secret) %>
Cloudinary requer um arquivo JavaScript config / cloudinary.yml adicional
// ruby code only possible with js.erb format
const abc = "<%= Rails.application.credentials.google_api_key %>"
Html
<!-- interpolate in script tag -->
<script src="https://maps.googleapis.com/maps/api/js?key=<%= "#{Rails.application.credentials.google_api_key}"%>"</script
Como compartilhar chaves com uma equipe
Compartilhe a chave
master.key
com outros desenvolvedores para habilitar a descriptografia.
Cada membro da equipe cria um arquivo
master.key
localmente na pasta de configuração e carrega-o na chave compartilhada.
Resultado
A programação está se tornando cada vez mais divertida, sem o incômodo e o incômodo de encontrar as chaves de API certas. Graças às credenciais, podemos atualizar o aplicativo levando em consideração as recomendações de segurança da informação. Compartilhe a chave mestra uma vez e livre-se da tediosa cópia.
Obrigado pela atenção!