看起來 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 和開源工具的多功能性嗎?