Rake api_key:get quebrado

Bem, uma instalação falhou (meu script de instalação obtém uma chave de API para que possa definir a mailgun_api_key). Também verifiquei na minha instância local de desenvolvimento.

$ rake api_key:get
rake aborted!
NoMethodError: undefined method `create_master_key' for ApiKey (call 'ApiKey.connection' to establish a connection):Class
Did you mean?  create_with
/home/pfaffman/src/discourse/lib/tasks/api.rake:5:in `block in <main>'
Tasks: TOP => api_key:get
(See full trace by running task with --trace)

É este commit. @david

Aqui está o PR: FIX: create_master_key got renamed by pfaffman · Pull Request #8325 · discourse/discourse · GitHub

Obrigado, @pfaffman. Fiz um comentário no PR.

Só confirmando: este é o seu script pessoal, não o script de instalação padrão?

Sim! Isso não quebrou uma instalação normal, apenas a parte do meu pós-instalação que precisa de uma chave de API para definir o mailgun_api_key.

Suspeito que poucas pessoas usem essa tarefa rake.

:+1: Por curiosidade, você limpa a chave da API quando termina? Você pode ter notado que fiz muitas mudanças recentemente para que possamos rastrear melhor as chaves da API. Estamos tentando reduzir o risco de chaves de API “não utilizadas” ficarem como potenciais falhas de segurança.

Se isso estiver sendo executado no servidor, talvez você possa usar Ruby para definir a configuração do site, em vez de gerar e usar uma chave de API?

Oh! Acredito que seria melhor não alterar a chave se ela já existir ou ter uma tarefa chamada create_if_not_exists. É muito útil poder obter a chave existente com uma tarefa rake sem precisar alterá-la e quebrar qualquer coisa que a utilize.

Em alguns pontos das minhas ferramentas Ansible, se não tiver a chave da API, chamo essa tarefa rake para obter a existente, como:

- name: Obter chave da API
  block:
    - shell: docker exec -w /var/www/discourse -i {{ discourse_yml }}  rake api_key:get
      register: get_api_key

    - set_fact:
        discourse_api_key: "{{ get_api_key.stdout }}"

  when: discourse_api_key is not defined

Acho que a única vez em que é realmente necessário obtê-la dessa forma é durante uma instalação limpa. (Para sites existentes, tenho a chave da API nas variáveis daquele site.)

Suponho que, com o novo modo como as chaves são tratadas, eu pudesse excluir a chave quando terminasse ou, digamos, alterar as configurações do site de alguma forma executando um script do Rails dentro do container?

Uma mudança que fiz é que agora é possível ter várias chaves por usuário (ou múltiplas ‘chaves mestras’). Isso significa que cada integração pode receber sua própria chave, e elas podem ser auditadas, revogadas ou excluídas separadamente. Então, no seu caso, você poderia criar uma chave com a descrição “ferramentas de configuração do pfaffman”. Assim, os administradores do site saberão para que serve e poderão revogar/excluir quando não for mais necessária.

Quanto a como isso se traduziria em uma tarefa rake… não tenho certeza. Talvez pudéssemos ter uma tarefa como api:get_or_create "minha descrição de chave" :thinking:

Isso funcionaria para o seu caso, @pfaffman?

Claro! Acho que seria simplesmente ótimo.

O que acha disso?

rake api_key:get_or_create_master["Onboarding Key"]

Se não houver objeções, farei o merge em algumas horas.

Parece ótimo para mim! E meu playbook ainda estava aberto no meu editor, então já estou comprometido. :slight_smile:

Merguei em

Desculpe @pfaffman, mas receio que terei que remover essa nova tarefa rake em um PR futuro. Vamos estar hashando as chaves de API no banco de dados, então será fundamentalmente impossível recuperar uma chave existente.

Substituí a tarefa get_or_create_master por uma tarefa create_master mais simples, que criará incondicionalmente uma nova chave. Se você quiser ter apenas uma chave, precisará manter o controle da chave no seu próprio sistema.

É, eu meio que imaginei que isso ia acontecer. Outros sistemas mostram a chave da API apenas uma vez, então…

Obrigado pelo aviso!

Não consigo dizer rapidamente. (Espere. Como não há schema.rb no diretório db?)

Se eu executar rake api_key:create_master['algum nome'] várias vezes com o mesmo algum nome, isso falhará? Ou seja, esse nome precisa ser único?

As descrições não precisam ser únicas, não. Embora possa ficar bastante confuso se você criar muitas chaves que pareçam iguais.

Nós não fazemos commit do arquivo schema.rb. O melhor lugar para procurar são as anotações no final de cada arquivo em /app/models.

Espera. O quê?! Desde quando? Todo commit que tenho na minha cópia atual do Discourse no meu HD ainda possui o schema.rb. É realmente, realmente útil poder descobrir exatamente qual modelo você está procurando. Poder abrir um único arquivo e pesquisar algo (por exemplo, para descobrir qual modelo você pode estar procurando) é muito mais fácil do que procurar em mais de 200 arquivos em app/models. Nem existe uma boa maneira de fazer grep apenas no esquema no final dos modelos.

Se você não sabe qual modelo está procurando, como pode encontrá-lo? Como há várias tabelas relacionadas a “auth”, nem todas começando com auth, como você pode começar a descobrir onde procurar?

Desde sempre, está no arquivo .gitignore. Mas ele é gerado quando você executa db:migrate, por isso está presente localmente.

O nome da tabela sempre corresponde ao nome do modelo, então eu apenas uso os nomes dos arquivos :man_shrugging:

Aha. Bem, mostra o que eu sei. :wink Obrigado pela explicação.

Às vezes, não consigo adivinhar o nome da tabela/modelo, então ter todos os campos em um só lugar é uma grande ajuda.