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 比較不安全

Hero Image
[台灣杉] 一鍵登入國網中心台灣杉(Taiwania)

台灣杉(Taiwania)是國網中心2018年啟用的超級電腦,登入時密碼必須附加OTP (One-time Password),國網中心建議取得OTP的方式是從驗證器取得OTP密碼,但這樣的方式每次都需要打開驗證器(手機、chrome插件… etc),並且需要手動輸入OTP,下面分享我從Windows以及Linux環境下登入台灣杉所使用的一鍵登入方式。 OTP的演算法可粗分為HOTP (HMAC-based OTP);以及基於HOTP的TOTP (Time-based OTP),我們不必瞭解演算法細節,只需知道台灣杉採用Base32編碼作為TOTP金鑰(Secret),時間間格為30秒,每30秒可以根據”Secret”與”當前時間區間”以sha1演算法生成一次性密碼(OTP,或稱為Key),由於這是單向加密的過程所以無法用時間區間與Key逆推Secret,並且OTP在成功使用一次之後就會被伺服器廢棄,以確保安全性。 注意事項 校時 由於TOTP演算法依據當前時間區間產生OTP,如果作業系統的時間不正確則會產生錯誤的OTP,在Windows環境之下可以到國家時間與頻率標準實驗室的網頁下載NTP校時軟體,以管理員身分執行進行校時;Linux環境可以用下述指令更新時間並寫入BIOS: # 從NTP時間伺服器進行網路校時 sudo ntpdate time.stdtime.gov.tw # 將更新的時間寫入BIOS sudo hwclock -w 所有登入行為之間必須間隔30秒(包含使用winSCP、putty或從Linux直接登入)。 每個30秒區間會產生一個OTP,而該OTP一旦經過使用就會被伺服器廢棄而無法再用。我曾經連續登入以為程式壞了,但核對iService上面產生的密碼又是一樣的,後來才發現這件事…中間還因為連登失敗太頻繁還被鎖,因此記得間隔30秒以上再登入。 Linux要登入台灣衫需要將台灣衫加入know host,以生醫節點為例: ssh-keyscan 140.110.148.14 1>>~/.ssh/known_hosts 2>/dev/null 從Windows登入台灣杉 前置工作 安裝Go,並設置GOPATH。 安裝putty。 安裝WinSCP。 知道怎麼打開windows的命令提示字元 (WIN+R、鍵入cmd、enter)。 編譯TOTP產生器 取得TOTP套件 go get github.com/pquerna/otp/totp 撰寫程式碼main.go package main import ( "fmt" "github.com/pquerna/otp/totp" "os" "time" ) func main() { secret := os.Args[1] code, _ := totp.GenerateCode(secret, time.Now().UTC()) fmt.Print(code) } 編譯 go build -o taiwaniaOTP.exe main.