2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Difyにkeycloakを使ってOauth認証を追加してみる

Posted at

はじめに

初投稿です。
お手軽にワークフローを作れるDifyですが、公開するチャットフローには認証が入りません。
今回はkeycloakを使ってdifyにOauth認証を追加してみようと思います。

環境・構成

環境は下記を利用しています。

  • wsl2

構成は下記です。

  • dify
  • keycloak
  • oauth2-proxy

dify-keycloak.drawio.png

構築

difyの構築と設定

  • Difyをgithubよりダウンロードします。
git clone https://github.com/langgenius/dify.git
  • 後にoauth2-proxyと疎通させるため、difyの/dify/docker/docker-compose.yamlを編集しnginxコンテナをネットワークに所属させます。
#~~~~略~~~~~
  nginx:
    image: nginx:latest
    restart: always
#~~~~略~~~~~
    networks:
+     - oauth2_network
+     - default
#~~~~略~~~~~
networks:
  # create a network between sandbox, api and ssrf_proxy, and can not access outside.
  ssrf_proxy_network:
    driver: bridge
    internal: true
  milvus:
    driver: bridge
  opensearch-net:
    driver: bridge
    internal: true
+  oauth2_network:
+    driver: bridge
  • Difyの公式手順に従い、Difyを立ち上げます。
cd dify
cd docker
cp .env.example .env
docker compose up -d

keycloakの構築と設定

  • docker-compose.yamlファイルを下記の通り作成します。
services:
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    environment:
      - KC_HOSTNAME=localhost
      - KC_HOSTNAME_PORT=8080
      - KC_HOSTNAME_STRICT=false
      - KEYCLOAK_ADMIN:admin
      - KEYCLOAK_ADMIN_PASSWORD:password
      - PROXY_ADDRESS_FORWARDING:"true"
      - KC_HTTP_ENABLED:"true"
    volumes:
      - keycloak-volume:/opt/keycloak/data
    ports:
      - 8085:8080
      - 8443:8443
    command:
      - start-dev
    networks:
      - oauth2_network
  
networks:
  oauth2_network:
    name: oauth2_network
    driver: bridge
    external: true

volumes:
  keycloak-volume:
    name: keycloak-volume
    driver: local
  • keycloakを立ち上げます。
docker compose up -d

oauth2-proxyの構築と設定

  • docker-compose.yamlへ下記を追記します。
    environmentについては前段のkeycloakで設定したパラメータを設定します。
services:
+  oauth2-proxy:
+    image: quay.io/oauth2-proxy/oauth2-proxy:latest
+    container_name: oauth2-proxy
+    ports:
+      - "4180:4180"
+    environment:
+      - OAUTH2_PROXY_PROVIDER=oidc
+      - OAUTH2_PROXY_CLIENT_ID=oauth2-proxy
+      - OAUTH2_PROXY_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxx
+      - OAUTH2_PROXY_COOKIE_SECRET=dummy
+      - OAUTH2_PROXY_COOKIE_SECURE:"false"
+      - OAUTH2_PROXY_COOKIE_NAME:"demo_cookie"
+      - OAUTH2_PROXY_TENANT_ID=xxxxxxxxxxxxxxxxxx
+      - OAUTH2_PROXY_OIDC_ISSUER_URL=http://localhost:8085/realms/test_realm
+      - OAUTH2_PROXY_EMAIL_DOMAINS=*
+      - OAUTH2_PROXY_REDIRECT_URL=http://localhost:4180/oauth2/callback
+      - OAUTH2_PROXY_UPSTREAMS=http://nginx:80
+      - OAUTH2_PROXY_HTTP_ADDRESS=0.0.0.0:4180
+    restart: always
+    extra_hosts:
+      - "localhost:host-gateway"
+    networks:
+      - oauth2_network
  keycloak:
#~~~~略~~~~~
  • keycloak・oauth2-proxyを立ち上げなおします。
docker compose down
docker compose up -d

※keycloakの立ち上がりに時間がかかるため、oauth2-proxyがしばらくエラーを吐きますが、立ち上がり後に自然に収まります。keycloakが立ち上がってもoauth2-proxyが立ち上がらない場合は、こちらだけ再起動してみてください。

  • アクセス
    立ち上げ後ブラウザよりoauth2-proxy(localhost:4180)へアクセスします。
    下記認証画面へ遷移するので「Sign in with OpenID Connect」を押下して認証へ進みます。
    image.png
    keycloakの認証画面に進むため、keycloakへ設定したユーザで認証します。
    image.png
    Difyの認証画面へアクセスすることができました。
    image.png

アプリケーションの公開

  • 適当なアプリケーションを作って公開します。
    image.png

  • 公開したアプリケーション(localhost:4180/chat/xxxxxxxxxxxxxxx)へアクセス
    Difyのダッシュボードへアクセスしたときと同様に認証画面が出てくるので、同様に進める。
    image.png

  • 認証を通過したうえでチャット画面へアクセスできました。
    image.png

終わりに

Difyの前段にoauth2-proxyを置くことで、keycloakの認証を入れることができました。
お試しで実施したもののため、諸々粗があるかと思いますが、ご了承ください。

参考

https://qiita.com/y_inoue15/items/bf7a960f7f7ff64f53e2
https://github.com/langgenius/dify

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?