SSO と '~' 文字の問題

皆さん、こんにちは。

最近、ユーザーのプロフィールに「~」を含めると、Discourseからbase64decodeエラーが発生することを発見しました。他の多くの問題のある文字(スペース、=、%、&)は問題なく処理できますが、なぜか「~」は処理できません。

他にこの問題に遭遇した方はいらっしゃいますか?

最初に考えたのは、エンコーディングが間違っている可能性ですが、まだ解決できていません。

以下は、エンコーディングのPython実装です。

return_payload = base64.urlsafe_b64encode(parse.urlencode(params).encode())

これは、他のすべての必要な情報とともに、直接「sso」に渡されます。

resp = requests.post(
       ".../admin/users/sync_sso",
        data={'sso': return_payload, ...}
        headers={...}
)

Discourseを最新バージョン(3.5.0.beta1-dev)に更新しましたが、問題は解決しません。

何か助けがあればお願いします!

「いいね!」 2

それはおそらく修正されるべきですが、その質問は私の給料やスキルを超えています。しかし、純粋な実用的な好奇心から:なぜ誰かがバイオグラフィーにチルダを使用するのでしょうか?

「いいね!」 1

まあ、もっともな質問だと思います。

多言語フォーラムを運営しており、他の文化圏では「〜」がよく使われています。例えば、韓国語では、トーンを和らげるために文末に「〜」がよく使われます。「ご不明な点がございましたら、お気軽にお知らせください〜」のように。

「いいね!」 2

これはバグレポートであり、サポートリクエストではないということですか?

「いいね!」 1

そうですか?バグとは、実行されたが機能しないものです。これは「完了したか否か」という質問に近く、サポートに関する質問でない場合は、より「#feature」に近いです。

はい、バグで適切だと思います。正しくbase64エンコードしていると信じており、discourseも正しくデコードできるはずです。

それはバグだと思います(再現できる場合に限ります)

「いいね!」 2

urlsafe_b64encode は、base64 エンコーディングのいくつかの文字を置き換えているようです。ドキュメントによると:

URL およびファイルシステムセーフなアルファベットを使用して bytes-like object s をエンコードします。これは、標準の Base64 アルファベットの + の代わりに - を、/ の代わりに _ を使用します。エンコードされた bytes を返します。結果にはまだ = が含まれる場合があります。

これは、結果が標準の base64 ではなく、Discourse のデコードと互換性がないことを意味します。

代わりに通常の b64encode 関数を使用することをお勧めします。必要に応じて、HTTP ライブラリが URL エスケープを処理してくれるはずです。

「いいね!」 5

さらに調査したところ、エンコード方法が間違っていたことが判明しました。

posterity のために、最終的に以下のようになりました。

return_payload = base64.b64encode(parse.urlencode(kwargs).encode("utf-8"))
h = hmac.new(secret.encode("utf-8"), return_payload, digestmod=hashlib.sha256)
resp = requests.post(
       ".../admin/users/sync_sso",
        data={"sso": return_payload, "sig": h.hexdigest()}
        headers={...}
)

リダイレクトを行う場合は、必ず {"sso"…} を parse.urlencode してください。

@sam@david、助けてくれてありがとう!

「いいね!」 3

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.