ターミナルにiTerm2を使っています。 iTerm2ではターミナル起動時の初期ディレクトリを設定できます。よく使うディレクトリがある場合は設定しておくと便利です。 設定方法 Settingsを開きます。 Profilesを開きます。デフォルトはHome directoryになってい…
Macでペアワイズ法サポートツールのPICTを使ってみます。 github.com PICTはWindows環境用のツールであり、Macで実行できるようにするのは面倒そうという先入観がありました。 が、今日ではbrewで提供されているので簡単にインストールできました。 formulae…
Ruby3.1からハッシュとキーワード引数の省略記法が使えます。 仕事でコードレビューをしていて「これは何だ?」と思ってしまったので確認しておきたいと思います。 www.ruby-lang.org ハッシュの場合 事前にc = 3のようにローカル変数を定義している場合、{ …
Rubyの特徴であるオープンクラスの勉強のため、Stringクラスに絵文字変換メソッドを追加してみます。 例えば、"カレー".to_emojiを実行するとがreturnされるイメージです。 実装 以下のように簡単に実装できました。 class String def to_emoji case self wh…
課題 Rubyでは、フィールド名+=というメソッド名を定義することで、インスタンス変数への代入のような表現ができます。 以下のサンプルコードでいうと、def name=(name)がそれにあたります。 class Person def initialize(name) @name = name end def name=…
概要 django-auditlogというjazzbandの管轄のDjangoのモデル操作の監査ログを作成してくれるライブラリがあります。 github.com 基本的な使い方は以下の記事でryu22eさんが紹介してくださっているので割愛します。 qiita.com モデルを監視してCRUD操作を検知…
課題 スギ花粉シーズンに花粉が飛ばない旅行先を調べると小笠原諸島、沖縄、北海道など簡単には行けないところばかり出てくる。 例外として草津が紹介されている記事を見かけたので理由を調べたところ、スギ花粉は標高1000m以上ではあまり飛ばないらしい。草…
課題 django-allauthのデフォルトでは、未ログイン状態でログイン必須な画面(=login_requiredやLoginRequiredMixinが使われている画面)にアクセスすると、以下のSign In画面にリダイレクトされる。 この画面で「Keycloak」を押すと続けて以下の画面に遷移す…
概要 KeycloakのIDトークン・アクセストークンにユーザーのカスタム属性を追加する方法を調べた。 ユーザーエンティティへの属性の追加 まずはKeycloak上のユーザーエンティティに属性を追加する方法を調べる。今回はユーザーのブログのURL(=blogUrl)という…
概要 Keycloakには「Admin REST API」というREST APIが存在する Keycloak Admin REST API ただしアクセスするためには以下の2段階のフローが必要で使うのがやや面倒くさい仕様である 1:トークン発行APIに問い合わせてアクセストークンを取得する 2:アクセス…
概要 ChatGPTに自分用のSQL整形ツールを作ってもらった。 GitHub Pagesで公開している。 delhi09.github.io コード github.com 背景 いまだにいいSQL整形ツールを見つけられていない ※ 自分が求めるいいSQL整形ツール どんな環境でも実行できる 設定なしでよ…
概要 ある既存の物語作品をベースとして、与えた設定を加味して別の物語作品のあらすじを創る(=換骨奪胎)ということを生成AI(OpenAI)にやらせてみた。今回は「銀河鉄道の夜」を題材としている。 www.aozora.gr.jp 背景 前提として、物語の抽象的な構造を分析…
概要 以下の記事などでKeycloak x django-allauthでの基本的なOIDC認証は検証できた。 kamatimaru.hatenablog.com 今回はOIDCで推奨されているセキュリティ対策の仕組みであるPKCEを追加してみる。 PKCE自体については巷に以下のような解説記事がたくさんあ…
概要 以下の記事の続き。 kamatimaru.hatenablog.com なぜかアクセストークンでKeycloakのUserinfoエンドポイントを叩いた場合 HTTPスタータスコードは200 コンテンツが0バイト という結果になってしまったのでデバッグする。 結論 以下のコマンドで取得でき…
概要 OIDCで認証した後、ロジック上の任意の箇所でアクセストークンを取得する方法を調べた。 やり方 まずはsettings.pyにSOCIALACCOUNT_STORE_TOKENSという設定値をTrueに設定する。 ※ デフォルトはFalse settings.py # ...省略 SOCIALACCOUNT_STORE_TOKENS…
概要 実際のアプリケーションでdjango-allauthを使用する際には、User保存処理をカスタマイズしたくなると思うので、その方法を調べていく。 以下の記事の流れでKeycloakを使ったOIDC認証を前提とする。 kamatimaru.hatenablog.com 準備 Djangoの公式ドキュ…
概要 以下の記事を参考にさせて頂きながら、Keycloak x django-allauthでのOIDC認証を検証していた。 ryu22e.org OIDC認証で認証成功した際に、django-allauthがDjangoの組み込みのユーザーモデルなどにデータをどのように保存するのか気になったので、実際…
課題 Keycloak x django-allauthでOIDCの認証を検証して時に、以下のような認証エラー画面が表示された。 OIDCのフローの赤枠で囲った部分(=Keycloakのログインには成功してリダイレクトでDjangoのredirect_uriにコールバックされてきたところ)で発生してい…
前提 アクセスログを取得したいなどの理由で、docker compose環境でKeycloakの前段にリバースプロキシサーバーを立てたくなった 使用したKeycloakのDockerイメージ: quay.io/keycloak/keycloak:26.0.6 まずはNginx まずは使い慣れているNginxでやろうとした…
概要 仕事でMarkdownではなくreStructuredTextで形式でリンクを書かないといけない時がある。 その際に、慣れてなくていつもドキュメントを見に行くか既存の他のリンクをコピるということをやってて時間がかかっていたので、コマンドで生成できるようにした…
以下の続き kamatimaru.hatenablog.com Userinfoエンドポイント Userinfoエンドポイントを実装する。 アクセストークンの永続化 Userinfoエンドポイントのリクエストにアクセストークンを使うので、まずはトークンエンドポイントで発行するアクセストークン…
以下の続き kamatimaru.hatenablog.com 公開鍵をRPに提供するエンドポイント 公開鍵をRPに提供するエンドポイントを実装する。「JWKsエンドポイント」というらしい。 developer.yahoo.co.jp RFC7517に仕様が存在するとのこと。 datatracker.ietf.org ディス…
以下の続き kamatimaru.hatenablog.com トークンエンドポイント 前提知識の確認 IDトークンはJWT(JSON Web Token)形式であることが仕様で決まっている。 https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#IDToken ID Token は JS…
以下の続き kamatimaru.hatenablog.com トークンエンドポイント 認可コードにユーザー情報を紐づける IDトークンの作成を実装していく。 IDトークンにはユーザー情報を含めるので、まずは認可コードにユーザー情報を紐づける必要がある。 同意画面のPOST処理…
以下の続き kamatimaru.hatenablog.com トークンエンドポイント 空のエンドポイントの実装 まずは空のエンドポイントを実装していく。 Viewを定義する。トークンエンドポイントはPOSTのみ。 views.py class TokenView(View): def post(self, request): retur…
前提 生成AIを使って作ってみたいのものがいくつかあるが、まずは何らかの生成AIサービスのAPIを使えるようにならないと話にならない。 → ChatGPTのAPIを使えるようになるところまでをやってみることにした。 試行錯誤したこと APIの画面が見つからない API…
以下の続き kamatimaru.hatenablog.com トークンエンドポイント トークンエンドポイント(=認可コードを受け取ってトークンを発行するエンドポイント)を実装していく。 https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint ディスカバリへ…
以下の続き kamatimaru.hatenablog.com 同意処理 前回は同意画面の表示までできたので、同意をsubmitした際に認可コードを返す処理を実装していく。 最終的には以下のようなステータス302のリダイレクトレスポンスを返す。 HTTP/1.1 302 Found Location: htt…
以下の続き kamatimaru.hatenablog.com ユーザー情報提供同意画面 ユーザー情報提供同意画面(以降「同意画面」とする)を実装する。 Viewの実装 同意画面のViewと雛形のテンプレートを作成して、urlを追加する。 views.py class ConsentView(View): def get(s…
以下の続き kamatimaru.hatenablog.com 認可エンドポイント RPのクライアントの作成 client_idの存在チェックをしていないので、RPのクライアントを作成できるようにしていく。 まずはModelを定義する。クライアントは一意なので、nameとclient_idにunique=T…