皆さん、こんにちは。
最近、ユーザーのプロフィールに「~」を含めると、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
Jagster
(Jakke Lehtonen)
2
それはおそらく修正されるべきですが、その質問は私の給料やスキルを超えています。しかし、純粋な実用的な好奇心から:なぜ誰かがバイオグラフィーにチルダを使用するのでしょうか?
「いいね!」 1
まあ、もっともな質問だと思います。
多言語フォーラムを運営しており、他の文化圏では「〜」がよく使われています。例えば、韓国語では、トーンを和らげるために文末に「〜」がよく使われます。「ご不明な点がございましたら、お気軽にお知らせください〜」のように。
「いいね!」 2
thoka
(Thomas Kalka)
4
これはバグレポートであり、サポートリクエストではないということですか?
「いいね!」 1
Jagster
(Jakke Lehtonen)
5
そうですか?バグとは、実行されたが機能しないものです。これは「完了したか否か」という質問に近く、サポートに関する質問でない場合は、より「#feature」に近いです。
はい、バグで適切だと思います。正しくbase64エンコードしていると信じており、discourseも正しくデコードできるはずです。
sam
(Sam Saffron)
7
それはバグだと思います(再現できる場合に限ります)
「いいね!」 2
david
(David Taylor)
8
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
system
(system)
クローズされました:
10
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.