はじめに
初投稿です。
お手軽にワークフローを作れるDifyですが、公開するチャットフローには認証が入りません。
今回はkeycloakを使ってdifyにOauth認証を追加してみようと思います。
環境・構成
環境は下記を利用しています。
- wsl2
構成は下記です。
- dify
- keycloak
- oauth2-proxy
構築
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
- ブラウザよりkeycloak(localhost:8085)へアクセスし、認証のための設定を実施します。
設定は下記記事を参考にします。
https://qiita.com/y_inoue15/items/bf7a960f7f7ff64f53e2
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」を押下して認証へ進みます。

keycloakの認証画面に進むため、keycloakへ設定したユーザで認証します。

Difyの認証画面へアクセスすることができました。
アプリケーションの公開
終わりに
Difyの前段にoauth2-proxyを置くことで、keycloakの認証を入れることができました。
お試しで実施したもののため、諸々粗があるかと思いますが、ご了承ください。
参考
https://qiita.com/y_inoue15/items/bf7a960f7f7ff64f53e2
https://github.com/langgenius/dify



