Discourse の Keybase 証明

Ok, so I should just redirect back to the new_proof_url endpoint, fair enough :slight_smile:

yeah. redirecting is perfect. it doesn’t have to redirect to new it could also go to the user’s profile page or settings page or something like that as long as the flash notice tells the user something actionable. whatever makes the most sense. i’m not really sure. no opinions.

the logged-in user is the discourse user that is making the proof

absolutely. yes. it looked like here we’re only checking if it’s the correct user on create and i’d argue we should also do it on new. there’s no sense in trying to save a proof that we know will fail.

The code I pushed is not the latest. I rewrote the create method, removing the check for the username param as it should not be necessary anymore (as the proof_valid? check will fail).

The new method is just a placeholder for Discourse routing logic, it will never be called and it needs to allow non-logged-in requests to allow the user to log in if they logged off previously :slight_smile:

EDIT: this is the new code I just pushed (still not very polished, I pushed it just to let you see it).

「いいね!」 2

About setting up a test domain: it would be great :slight_smile:

「いいね!」 3

I am having issues updating the proof custom field. The first time I put a JSON object in it, it works, but any attempt to change the value of the custom field fails. This is the code:

    def create
      kb_username = params.fetch('kb_username')
      sig_hash = params.fetch('sig_hash')

      proof = Proof.new(current_user.username, kb_username, sig_hash)
      unless proof.valid?
        raise Discourse::InvalidParameters, I18n.t('keybase_proofs.invalid_proof')
      end

      proofs = current_user.custom_fields['keybase_proofs'] || {}
      # Override the signature because the old one might have been
      # revoked and not yet updated on our side.
      proofs[kb_username] = proof.signature

      current_user.custom_fields['keybase_proofs'] = proofs
      current_user.save
      
      render json: success_json
    end

the first time this code is called, it adds the proofs to the custom field named "keybase_proofs". If I call it again, it doesn’t update the custom field.

Some more information: if I change the type of the custom field to a string, it works correctly.

「いいね!」 1

Is that code up to date in GitHub?

I assume that

Is not returning a hash, so on the first time it works because you coalesce it to an empty Hash. But it fails on subsequent tries because it’s returning something else.

Adding a debugging break point there may help.

「いいね!」 2

Unfortunately not. Since I am learning how everything works together, my code is almost always in a very sad shape, not really worth pushing. But the code that is in GitHub shows exactly the same issue (but I didn’t push the tests).

In the latest version of the code, which I have locally, I got rid of the JSON type and I am just using serialized JSON strings instead, and it is now working fine.

This is not the case. When I say that “it fails”, I mean “it fails to update” the field. So the first time the code runs, it saves the custom field correctly (I can also retrieve it, I use the data in the profile page and in the check proof endpoint). The second time I run the code (ie, if I add another Keybase identity to the same Discourse user), the custom field is not updated, it keeps only the first signature I added.

In case you’re curious and you want to debug the issue, I’ll create a branch with the original code and tests (that were failing) so you can investigate :slight_smile:

Unfortunately I don’t know how to do it for this codebase using VS Code :frowning: do you have any advice on an alternative editor? RubyMine?

Thanks!

You can add a byebug to any line in the controller, and when that line is hit the console where you started the webserver (the one you run bin/unicorn -x) will stop and allow you to inspect the variables.

「いいね!」 9

The debugger confirms what I saw with previous testing: the JSON is stored the first time, and any attempt to change it later gets silently ignored. Anyway, for now I have fixed it by manually parsing/encoding the JSON string in the custom field.

Hello everyone! In particular @sam and @kb_xgess.

The plugin is in good enough shape now to get reviewed: GitHub - etamponi/discourse-keybase-proofs-plugin: Discourse Plugin for Keybase Proofs.

It should mostly work. There are a few things to fix before it is “shippable”:

  • The “new proof” UI needs some CSS love. It should also show an error if the logged in user is not the one for which the proof is requested.
  • The config endpoint /keybase-proofs/config needs a couple of SVG logos, but I don’t know where to get them from. Ideas? @kb_xgess, do they need to be SVG? Do you need both the black&white and the colored one?
  • redirect-after-login doesn’t work currently. @techAPJ is investigating, might be a bug in Discourse core or (more likely?) a bug somewhere in the plugin.

Some notes on code quality:

  • I didn’t write frontend tests. I think I’ve got the gist of how to write tests for components, but I didn’t want to spend more time figuring out how to mock requests and so on.
  • proof_controller.rb has a very ugly pic_url method, needed because I couldn’t make the call to the keybase API from the client because of CORS. I guess it can be moved to somewhere else or someone can figure out how to fetch the information from the client side.
  • I didn’t run any linter/formatter on the code. Should I?
  • The README might need some love :slight_smile:
「いいね!」 7

ぜひ試してみたいのですが、テストインスタンスはありますか?

「いいね!」 2

エンドポイントの URL は何ですか?開発者にリクエストすることはできますか?

私の知る限り、これは Keybase 側でインスタンスごとに許可する必要があります。

@kb_xgess さん、meta.discourse.org を追加していただけませんか?

「いいね!」 2

コードをいくつか拝見しています。:slight_smile: 素晴らしい進捗ですね!meta.discourse.org について簡単な質問ですが、これは異なるコードベースで動作しているのでしょうか?あなたのコードをそこにデプロイすることは可能でしょうか?その理由として、双方向プロトコルの一部では、ホストされた証明を確認するために Keybase が Discourse にアクセスする必要があります。もしそこに存在しなければ、すべてが失敗してしまいます。そのため、本番環境ほど厳格ではないパブリックサーバーでイテレーションを進めた方が、あなたにとってはスムーズかもしれません。もしご理解いただければ、ステージング環境やホストされた開発環境がよいでしょう。あるいは、ngrok のアカウントをお持ちであれば、あなたのローカルホストに常時プロキシする静的な URL を用意することも可能です(必要時だけ起動し、すべてあなたの側で制御できます)。もし meta.discourse.org 上で必要な柔軟性が得られるのであれば、あなたのコードに含まれる設定といくつかのデフォルト値を適用して、そのサイト向けに有効化することもできます。

もう一点、SVG についての質問です。SVG が最適なのは、モバイルアプリ、デスクトップアプリ、Web サイト向けに、さまざまなサイズの PNG をいくつか作成する必要があるためです。すべての出力を同じ初期入力から生成できれば、全員にとって作業が容易になるはずです。

「いいね!」 5

残念ですね。それは必然的なことなのでしょうか、@kb_xgess?私は、Keybaseにプラグインが動作しているDiscourseサーバーのいずれかのプロファイルへのリンク(あるいはコアに組み込まれる場合は任意のDiscourseサーバーへのリンク)を提供するだけで、どのDiscourseサーバーでも証明が可能になることを期待していました。

サービスの開始時に、彼らの発表ポストで非常に明確に示されていました。

ドメインを簡単に追加できる場合は、keybase-test.demo.discourse.org 用のドメインを追加してください。まもなくテスト用にこれを起動する予定です。

「いいね!」 4

ああ。私が思っていたほど詳しく追っていなかったのかもしれません。:crying_cat_face:

ちょっと待って。それは元投稿(OP)から得られる解釈とは違いますね:

ああ、でも Keybase ♥'s Mastodon, and how to get your site on Keybase によると、彼らはリンクしないそうです。

それは理解できますね。:wink:

「いいね!」 6

はい、必要なツール類をすべて作成する計画です。@kb_xgess が、適切と判断されるコミュニティ向けにそれを有効化すると確信しています。ただし、それがすべてのゴーストタウンやログイン必須のインスタンスに適用されるという意味ではありません。

「いいね!」 4

このレトロな方法はプラグインでサポートされていますか?よくわかりません。

「いいね!」 1

いいえ、新しい方法はサポートされていますが、Keybaseによるホワイトリスト登録が必要です。

それが、KeyBase にウェブサイトの所有権を証明する方法です。似たような方法が機能するかと考えましたが、それは間違いでした。