看起來 OAuth 2.0 框架[1] 已經越來越廣泛地應用於 web (和 移動) 應用。太棒了!
雖然協議本身並不複雜,但有很多的使用場景、流程和實現可供選擇。正如生活中的大多數事物一樣,魔鬼在於細節之中。
在審查 OAuth 2.0 實現或編寫滲透測試報告時我習慣畫出 UML 圖。這方便讓人理解發生了什麼事情,併發現潛在的問題。畢竟,一圖抵千言。
使用基於 GPL 開源協議 Emacs[2] 編輯器來實現,再加上基於 GPL 開源協議的工具 PlantUML[3] (也可以選擇基於 Eclipse Public 協議的 Graphviz[4]) 很容易做到這一點。
Emacs 是世界上最萬能的編輯器。在這種場景中,我們用它來編輯文字,並自動將文字轉換成圖片。PlantUML 是一個允許你用人類可讀的文字來寫 UML 並完成該轉換的工具。Graphviz 是一個視覺化的軟體,這裡我們可以用它來顯示圖片。
下載 預先編譯好了的 PlantUML jar 檔案 [5],Emacs[6] 還可以選擇下載並安裝 Graphviz[7]。
安裝並啟動 Emacs,然後將下麵 Lisp 程式碼(實際上是配置)寫入你的啟動檔案中(~/.emacs.d/init.d),這段程式碼將會:
plantuml 新增到可識別的 “org-babel” 語言中(這讓你可以在文字檔案中執行原始碼)-
;; tell org-mode where to find the plantuml JAR file (specify the JAR file) -
(setq org-plantuml-jar-path (expand-file-name "~/plantuml.jar")) -
-
;; use plantuml as org-babel language -
(org-babel-do-load-languages 'org-babel-load-languages '((plantuml . t))) -
-
;; helper function -
(defun my-org-confirm-babel-evaluate (lang body) -
"Do not ask for confirmation to evaluate code for specified languages." -
(member lang '("plantuml"))) -
-
;; trust certain code as being safe -
(setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate) -
-
;; automatically show the resulting image -
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images)
如果你還沒有啟動檔案,那麼將該程式碼加入到 ~/.emacs.d/init.el 檔案中然後重啟 Emacs。
提示:Control-c Control-f 可以讓你建立/開啟(新)檔案。Control-x Control-s 儲存檔案,而 Control-x Control-c 退出 Emacs。
這就結了!
要測試該配置,可以建立/開啟(Control-c Control-f)字尾為 .org 的檔案,例如 test.org。這會讓 Emacs 切換到 org 樣式並識別 “org-babel” 語法。
輸入下麵程式碼,然後在程式碼中輸入 Control-c Control-c 來測試是否安裝正常:
-
#+BEGIN_SRC plantuml :file test.png -
@startuml -
version -
@enduml -
#+END_SRC
一切順利的話,你會在 Emacs 中看到文字下麵顯示了一張圖片。
註意:
要快速插入類似
#+BEGIN_SRC和#+END_SRC這樣的程式碼片段,你可以使用內建的 Easy Templates 系統:輸入然後按下TAB,它就會自動為你插入模板。
還有更複雜的例子,下麵是生成上面圖片的 UML 原始碼:
-
#+BEGIN_SRC plantuml :file t:/oauth2-abstract-protocol-flow.png -
@startuml -
hide footbox -
title Oauth 2.0 Abstract protocol flow -
autonumber -
actor user as "resource owner (user)" -
box "token stays secure" #FAFAFA -
participant client as "client (application)" -
participant authorization as "authorization server" -
database resource as "resource server" -
end box -
-
group user authorizes client -
client -> user : request authorization -
note left -
**grant types**: -
# authorization code -
# implicit -
# password -
# client_credentials -
end note -
user --> client : authorization grant -
end -
-
group token is generated -
client -> authorization : request token\npresent authorization grant -
authorization --> client :var: access token -
note left -
**response types**: -
# code -
# token -
end note -
end group -
-
group resource can be accessed -
client -> resource : request resource\npresent token -
resource --> client : resource -
end group -
@enduml -
#+END_SRC
你難道會不喜歡 Emacs 和開源工具的多功能性嗎?
知識星球