Django實現CAS+OAuth2的方法示例
阿新 • • 發佈:2020-01-09
CAS
Solution
- 使用CAS作為認證協議。
- A作為主要的認證提供方(provider)。
- A保留使用者系統,其餘系統如xxx/www不保留使用者系統,即Provider的實現在A。
- 實現步驟
- xxx 選擇登入,跳轉到LMS的認證介面,CAS讀取資料庫進行認證,redirect到xxx的介面並且附帶ticket在url中,在瀏覽器中存入Cookie。
- xxx得到ticket後向CAS傳送ticket驗證有效性。
- xxx允許使用者訪問內部資源。
django程式碼
初始化一個client專案
django-admin startproject cas-client
Install Dependencies
pip install django-mama-cas # server pip install django-cas-ng # client
Server
# settings.py INSTALLED_APPS = ( 'mama_cas',) # 允許退出登入,可選項 MAMA_CAS_ENABLE_SINGLE_SIGN_OUT = True # 重要!,service是client的IP,是個陣列,可以在後面新增SERVICE的HOST:PORT。 MAMA_CAS_SERVICES = [ { 'SERVICE': 'http://127.0.1.1:8000','CALLBACKS': [ 'mama_cas.callbacks.user_model_attributes',# 返回除了password的所有Field # 'mama_cas.callbacks.user_name_attributes',# 只返回 username ],'LOGOUT_ALLOW': True,'LOGOUT_URL': 'http://127.0.1.1:8000/accounts/callback',},] # urls.py url(r'',include('mama_cas.urls')),
不要忘記:
python3 manage.py migrate
Client
# settings.py INSTALLED_APPS = ( # ... other installed apps 'django_cas_ng',) AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend','django_cas_ng.backends.CASBackend',) # 也就是LMS的地址 CAS_SERVER_URL = 'http://127.0.0.1:8000' CAS_VERSION = '3' # 存入所有CAS 服務端返回的user資料。 CAS_APPLY_ATTRIBUTES_TO_USER = True # urls.py import django_cas_ng.views as cas_views url(r'^accounts/login$',cas_views.login,name='cas_ng_login'),url(r'^accounts/logout$',cas_views.logout,name='cas_ng_logout'),url(r'^accounts/callback$',cas_views.views.callback,name='cas_ng_proxy_callback'),
Also:
python3 manage.py migrate
使用流程
- client上選擇登入,後臺redirect到server的/accounts/login。
- 認證通過,在client上的host下會有登入Cookie,成功登入到系統,重定向到client的主頁。
- client上選擇退出,後臺redirect到server的/accounts/logout。
注意事項
- server與client不能在同一個host下,會發生500內部錯誤,因為Cookie要存回client的host下。
- 本地測試下,client啟動在127.0.1.1:8000的時候,要在settings.py中ALLOWED_HOSTS中新增這個IP。
- client端要實現接收空路由情況,在CAS Server認證完畢後,返回地址為根地址。
- client端退出登入同樣要經過CAS Server,同時要在CAS Server中開啟允許退出登入。
Oauth2 結合 CAS 搭建認證系統
- 在CAS頁面,點選Github登入,利用state引數儲存當前頁面的service引數。
- 點選確認登陸後,返回state,獲取使用者資料,重定向到一個處理函式。
- 登入系統,傳送ticket,重定向到service。
- 兩個request不是同一個request,所以無法用session或cookie儲存service的url。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。