Hero Image
[架構] 多層式架構(Multi-layer Architecture)

中文多層架構的層可翻作 layer 或 tier,兩者主要的差別在於 layer 指程式邏輯在應用程式的位置;而 tier 指 layer 在系統上實際部屬執行的位址,屬於物理層級的指涉。這一篇的層說的是 layer,談如何在軟體層面利用分層 (layer) 妥善安排程式碼,以 multi-layer 撰寫程式碼能將複雜的邏輯隔離開達成關注點分離(SoC, Separation of concerns),好處有: 降低耦合:程式拆成各司其職的單元,降低彼此耦合,增加程式單元彈性(擴展性)、複用性。 易於維護:多層式架構中程式碼各司其職,容易定位問題發生點、而非從整個應用程式邏輯找。 敏捷開發:程式可快速回應需求修改(理由與易於維護類似,但是在開發時獲得的好處)。 平行開發:解耦的程式有助於降低協作併版衝突。 分層 三層式架構 一般來說最常用的三層式架構組成為: 表現層 (PL; Presentation Layer):ASP 內就是 Controller 結尾。 商業邏輯繩 (BLL; Business Logic Layer):又稱為 Service Layer,命名習慣是 Service、Helper 結尾。 資料存取層(DAL; Data Access Layer):命名習慣是 Repo 結尾。 另外有人將 Domain、Common 稱為一層,但這個部分其實不太像層,因為會被每一層引用,在架構上呈現比較不像層那樣扁平,裡面包含: Model、Entity、DTO(Data transfer object) 或 Value Object,這裡只有屬性沒有方法。 四層式架構 為了降低 PL 與 BL 之間的耦合,有時會在 Business Logic Layer(BLL) 上再疊一層 Service Layer(SL),作為 Presentation Layer 與 Business Layer 的中介層,這時 Business Logic Layer 的命名就不以 Serviece 結尾,通常較大型專案才需要如此分法。

Hero Image
[Keycloak] docker 安裝

採用的映象檔是 bitnami/keycloak ,因為我需要使用網址來區分服務(同一個 port 的情況下),所以採取反向代理的方式,一方面讓之後要部屬其他應用、加上憑證、等等操作都交給 nginx 比較方便。 建立 docker 網路 mynetwork,如果設定其他名稱,以下步驟再自行調整對應。 docker create network mynetwork 建立 docker-compose 環境 keycloak/.env KEYCLOCK_IMAGE=bitnami/keycloak:23.0.3 KEYCLOAK_DATABASE_VENDOR=postgresql KEYCLOAK_DATABASE_PORT=5432 KEYCLOAK_DATABASE_USER=keycloak KEYCLOAK_DATABASE_PASSWORD=password KEYCLOAK_DATABASE_NAME=keycloak KEYCLOAK_ADMIN_USER=admin KEYCLOAK_ADMIN_PASSWORD=admin keycloak/docker-compose.yml version: '3' volumes: postgres_data: driver: local services: keycloak_db: image: postgres restart: always volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: ${KEYCLOAK_DATABASE_NAME} POSTGRES_USER: ${KEYCLOAK_DATABASE_USER} POSTGRES_PASSWORD: ${KEYCLOAK_DATABASE_PASSWORD} networks: - mynetwork keycloak: image: ${KEYCLOCK_IMAGE} environment: KEYCLOAK_DATABASE_VENDOR: ${KEYCLOAK_DATABASE_VENDOR} KEYCLOAK_DATABASE_HOST: keycloak_db KEYCLOAK_DATABASE_PORT: ${KEYCLOAK_DATABASE_PORT} KEYCLOAK_DATABASE_NAME: ${KEYCLOAK_DATABASE_NAME} KEYCLOAK_DATABASE_USER: ${KEYCLOAK_DATABASE_USER} KEYCLOAK_DATABASE_PASSWORD: ${KEYCLOAK_DATABASE_PASSWORD} KEYCLOAK_DATABASE_SCHEMA: public KEYCLOAK_ADMIN_USER: ${KEYCLOAK_ADMIN_USER} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD} KEYCLOAK_ENABLE_HEALTH_ENDPOINTS: 'true' KEYCLOAK_ENABLE_STATISTICS: 'true' KC_PROXY: edge KC_PROXY_ADDRESS_FORWARDING: 'true' KC_HTTP_ENABLED: 'true' restart: unless-stopped networks: - mynetwork depends_on: - keycloak_db networks: mynetwork: external: true 建立 nginx/nginx.

Hero Image
[授權] OAuth2.0

OAuth 是一個開發標準(Open Standard),用來處理有關「授權」(Authorization)相關的問題 允許授權當下的APP取得使用者在平台的相關資訊 OAuth2 有很多變化 腳色: Resource Owner,也就是使用者。 Client,要向使用者取得權限的應用程式,有自己的 Client ID、 Client Secret。 Authorization Server,負責驗證使用者身分、發 Access Token 給應用程式 Resource Server,存放資源的伺服器,認 Token 給使用者存取資源 用詞 Authorization Grant 同意應用程式取得資源 Redirect URI 驗證伺服器驗證、授權完畢後,返回應用程式的路徑 Scope 授權範圍 OAuth2.0 四種授權類型流程(Grant Types): Authorization Code 最常見,步驟: 應用程式(Client) 將使用者導向 Authorization Server,提供 Redirect URL, scope, 應用程式的 client id… Authorization Server 驗證使用者身分,通過之後發給 Authorization Grant,將網址列帶上 Authorization Grant 後將使用者導回 Redirect URI 回到應用程式(Client)。 應用程式(Client)拿 Authorization Grant 和 Authorization Server 換取 Access Token,Authorization Server 會透過應用程式(Client)專屬的 Client ID、 Client Secret 驗證應用程式身分。 應用程式(Client)帶著 Access Token 向 Resource Server 存取資源 Implicit 適合在 Client-side 運行的應用程式適合使用,例如 SPA(Single Page Application) 跳過交換 Access Token 的過程,由 Authorization Server 直接給予 Access Token 比較不安全