跳到主要內容

CI4 + Google Oauth2

因自己在教育處寫的系統無法使用 SSO OpenID 的認證服務,所以改以使用 Google OAuth2.0 作 gm.kl.edu.tw 網域帳號的認證。不過,後來發現把這一部份研究清楚也很有好處,首先不會受限於一定要是 OpenID 帳號才能使用的系統,因為現實面上有很多老師和承辦還是不習慣使用 OpenID 附帶的 gm.kl.edu.tw 帳號;再後來用了 firebase 服務後,更可以擴大到更廣的 OAuth(如FB、Github…等)。



 Google API 提供 OAuth2.0 的帳號認證服務,主要的功能是提供網頁系統可以認證 Google 帳號,並提供認證帳號的基本資訊。

Google Cloud 網址:https://console.cloud.google.com/

在CI4要使用 Google OAuth2.0須先在 CI4 系統中安裝 「Google APIs Client Library for PHP」

composer require google/apiclient:^2.12.1

認證程式參考資料:Login with Google for Codeigniter 

https://github.com/angel-of-death/Codeigniter-Google-OAuth-Login

Google Cloud API 設定

1. 到 Google Cloud 建立專案


2. 在專案的 「API和服務」功能下建立 OAuth2.0用戶端憑證:


用戶端憑證有兩種情形:內部及外部。

「內部」表可以直接使用來認證與專案同網域的帳號,「外部」表可以用來認證任何網域的 Google 帳號,但需要經過 Google 的程式審查,我還沒試過!後來用了 firebase 後就可認證其他網域的帳號了。


在憑證的設定中,最重要的已授權的重新導向URI的部份,也就是一般的 Call Back URI,成功經過 Google 認證後會自動導向的網址,並會附帶 token,利用這個 token 就可以進一步取得使用者的基本資訊。

而同時有好幾個網站都用這一個用戶端憑證時(基本上我寫的所有網站都是用這個憑證…),要如何分辨是哪個網站來的?要回去哪邊?
就是用設定來指定 redirectURI:


我採用上述的範例程式改的,所以設定檔是放在 App/Config/Google.php中。

認證程序:

Google OAuth2 整個流程為:取得認證網址(內含 projectID 和 redirectURI)→ Redirect 到 Google 進行認證 → 認證不通過則顯示錯誤訊息,認證通過後依照 redirectURI 返回系統(帶著 tokenID)→ 由網頁系統再藉由 tokenID 連去 Google 取得使用者基本資訊 → 網頁系統跟據使用者的資料進行設定 → …

1. 取得 google apiclient 的 auth url ,加到 login 的連結上。



2. 連線到 Google 進行認證




如果使用 chrome 瀏覽器,而且有使用同步的功能時,會自動取得同步的帳號。

3. 如果認證成功的話,就會依照 redirect uri 的設定轉至 callback uri 並帶使用者的token,以供後續取得使用者資訊;如果認證失敗的話,則由 Google 產生認證不成功的資訊。


認證成功後,用 getUserInfo()取得使用者的基本資料。


藉由token google client API 從 google 取得帳號的基本資料後,再進行系統內的權限設定等等。




留言

這個網誌中的熱門文章

SSH Tunnel(Port Forwarding)的應用

自己在管理伺服器和防火牆原則是最小開放原則,一定需要的服務 port 才會開放,例如網頁伺服器的 80、443 等。而管理用的 ssh ,可以的話就限縮來源 IP 範圍,加上限制可以登入的帳號或群組,要不然就改 port 編號;不過,改 port 編號會變成自己在遠端登入時要回想是改成多少,有點不是很方便。 所以最近建置的伺服器就不改 port 了,會加上 fail2ban 的防衛機制。 因為最小開放原則,像是 webmin(10000)這樣的 port 就不會開放,如果想要用的話,就用 ssh tunnel 方式作跳板連接。 例如伺服器的 public ip:123.123.123.123,要連 webmin 的話,就用: ssh 123.123.123.123 -L 10000:127.0.0.1:10000 SSH 登入後就會在客戶端開啟 127.0.0.1:10000 的監聽埠,用瀏覽器連本機的 127.0.0.1:10000 就會跳到伺服器端的 10000 埠。 一直以來,我都以為 ssh -L (Local Port Forwarding)方式只會在本機端綁定 127.0.0.1:xxxx的情形。不過,最近因為要解決一個臨時伺服器的設定問題,才發現原來不是只能綁在 127.0.0.1 上。 網路架構: 外部 public ip:123.123.123.0/24 內部 private ip:10.1.0.0/16 內部切出多個 class C的網路區域,其中 10.1.1.0/24 是 ServerZone,在外面用 DNAT 的方式將服務要求導入內部的伺服器。 其他 10.1.n.0/24 是各個區域內容IP,只能 NAT 出去,外部不能訪問到。 需求: Server-01:10.1.1.2,Server-02:10.1.20.2 Server-01在 ServerZone 內,從外部可以訪問,Server-02 在 PrivateZone 內,外部連不到。ServerZone 和 PrivateZone 彼此可以 SSH 互連。 現在希望可以在不變動兩台 Server 的 IP 區域,讓 Server-02可以被外部訪問到。 最簡單的方式就是先登 Server-01後,再從 Server-01 terminal 登到 Server-02上。但是需求是,...

IPv6 系列(五):KEA DHCP SERVER

學校在純 IPv4 的環境時,採用 ISC-DHCP Server 來發放教學區域的私有 IP(10.10.xxx.xxx),並使用閘道 Fortigate 作 NAT 連接到 Internet。 採用 IPv6 後,原本是要使用 ISC-DHCPv6 來作為 IPv6 發放,結果 ISC-DHCPv6 架不起來。不過在查詢 DHCPv6 的過程中,發現 ISC(Internet System Consortium)已開發出下一代的 DHCP Server:Kea Dhcp Server。 Kea Dhcp Server 官網: https://www.isc.org/kea/ 摘錄  https://www.itread01.com/content/1548712273.html  對 Kea DHCP Server 的介紹: Kea DHCP Server 由 Internet Systems Consortium(ISC) 開發的開源 DHCPv4/DHCPv6 伺服器。Kea DHCP Server 是一個高效能的,可擴充套件的DHCP伺服器引擎。通過hooks library可以很容易的修改和擴充套件。 Kea包含的功能元件 keactrl — kea伺服器啟動,停止,配置重置和狀態查詢元件 kea-dhcp4 — DHCPv4伺服器程式,用於響應客戶端的DHCPv4查詢。 kea-dhcp6 — DHCPv6伺服器程式,用於響應客戶端的DHCPv6查詢。 kea-dhcp-ddns — DHCP動態DNS程式.這個程式在DHCP伺服器和DNS伺服器之間扮演者調解者。它接收來自DHCP伺服器域名更新請求和傳送DNS更新訊息給DNS伺服器。也就是說DDNS捕獲使用者每次變化的IP地址,然後將其與域名相對應,這樣其他上網使用者就可以通過域名來進行交流。而最終客戶所要記憶的全部,就是記住動態域名商給予的域名即可,而不用去管他們是如何實現的。 軟體執行環境 加密庫Botan或者OpenSSL log4cplus 1.0.3+ 如果有需要mysql,需要MySQL headers and libraries。可選(postgresql、cassandra類同) 選用 Kea DHCP Server 的原因,...

IPv6 系列(四):安全公用 DNS

繼學校開始採用 IPv6 後,在 Fortigate 防火牆除了原有的 IPv4 規則外,還要針對 IPv6 作設定。因為學校的資安策略除了會管制外部對內往伺服器的連線外,還會針對內部對外的不當連線,加上惡意網域日新月異,防不勝防,如此一來會增加人員與設備的負擔。 在 IPv4 環境中,學校內行政辦公室電腦採用固定 IP,其他教學部份均為 DHCP 動態發放 IP。而在 IPv6 的環境下,不管是 Stateless 或 Stateful 設定 IPv6,都會用到 DHCPv6 來設定 DNS 資訊。一般上網的動作一定會有 DNS 查詢的動作,所以可以把 DNS 查詢當作資安的防護層,也就是採用具有過瀘功能的公用 DNS 伺服器(Public DNS servers)。 提到 public dns server,一般都會想到的是 Google public dns 服務(8.8.8.8、8.4.4.8),但查詢 Google 的說明似乎沒有看到 Google 會特別針對資安防護的功能,所以改採用 cloudflare dns。 cloudflare dns 可以設定不同安全等級的 dns 位址: 一般使用 1.1.1.1  1.0.0.1 2606:4700:4700::1111  2606:4700:4700::1001 Malware Blocking Only 1.1.1.2 1.0.0.2 2606:4700:4700::1112 2606:4700:4700::1002 Malware and Adult Content 1.1.1.3 1.0.0.3 2606:4700:4700::1113 2606:4700:4700::1003 而且從 cloudflare dns 的官網說明上看,它還有隱私、安全的功能,速度也比較快。 除了 cloudflare dns 外,還有 opendns、comodo sercure dns 也有提供安全等級的選擇,但速度比較慢。 參考資料: https://blog.cloudflare.com/introducing-1-1-1-1-for-families/ https://developers.cloud...