看起來 OAuth 2.0 框架 已經越來越廣泛地應用於 web (和 移動) 應用。太棒了!
雖然協定本身並不複雜,但有很多的使用場景、流程和實現可供選擇。正如生活中的大多數事物一樣,魔鬼在於細節之中。
在審查 OAuth 2.0 實現或編寫滲透測試報告時我習慣畫出 UML 圖。這方便讓人理解發生了什麼事情,並行現潛在的問題。畢竟,一圖抵千言。
使用基於 GPL 開源協定 Emacs 編輯器來實現,再加上基於 GPL 開源協定的工具 PlantUML (也可以選擇基於 Eclipse Public 協定的 Graphviz) 很容易做到這一點。
Emacs 是世界上最萬能的編輯器。在這種場景中,我們用它來編輯文字,並自動將文字轉換成圖片。PlantUML 是一個允許你用人類可讀的文字來寫 UML 並完成該轉換的工具。Graphviz 是一個視覺化的軟體,這裡我們可以用它來顯示圖片。
下載 預先編譯好了的 PlantUML jar 檔案 ,Emacs 還可以選擇下載並安裝 Graphviz。
安裝並啟動 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@startumlversion@enduml#+END_SRC
一切順利的話,你會在 Emacs 中看到文字下面顯示了一張圖片。
注意:
要快速插入類似
#+BEGIN_SRC
和#+END_SRC
這樣的程式碼片段,你可以使用內建的 Easy Templates 系統:輸入<s
然後按下TAB
,它就會自動爲你插入模板。
還有更複雜的例子,下面是生成上面圖片的 UML 原始碼:
#+BEGIN_SRC plantuml :file t:/oauth2-abstract-protocol-flow.png@startumlhide footboxtitle Oauth 2.0 Abstract protocol flowautonumberactor user as "resource owner (user)"box "token stays secure" #FAFAFAparticipant client as "client (application)"participant authorization as "authorization server"database resource as "resource server"end boxgroup user authorizes clientclient -> user : request authorizationnote left**grant types**:# authorization code# implicit# password# client_credentialsend noteuser --> client : authorization grantendgroup token is generatedclient -> authorization : request token\npresent authorization grantauthorization --> client :var: access tokennote left**response types**:# code# tokenend noteend groupgroup resource can be accessedclient -> resource : request resource\npresent tokenresource --> client : resourceend group@enduml#+END_SRC
你難道會不喜歡 Emacs 和開源工具的多功能性嗎?