2014-01-23 72 views
2

令牌我有一個疑問:掌握的Django的Oauth工具包

根據該文件,爲獲得令牌,我需要做到這一點:

curl -X POST -d "grant_type=password&username=<user_name>&password=<password>&scope=read" http://<client_id>:<client_secret>@localhost:8000/o/token 

在我的系統,我有兩種可能性登錄,一個用django的auth用戶,另一個用facebook。其中一個auth用戶一切工作正常,但與facebook我將用戶的憑據存儲在另一個表中,而不是auth用戶。所以,當我嘗試擁有令牌時,我無法做到這一點,因爲我沒有authdjango用戶的用戶名和密碼,因此oauth工具包迫使我在POST中擁有它。

我該如何讓它有兩個獲得令牌的機會,username & password和用戶界面和facebook的令牌?

謝謝你的幫助。

問候。

回答

1

您可以覆蓋DOT的默認行爲,並通過編寫自己的OAuth2Validator類用戶進行身份驗證,這樣的:

from oauth2_provider.oauth2_validators import OAuth2Validator 

class MyOAuth2Validator(OAuth2Validator): 
    def validate_user(self, username, password, client, request, *args, **kwargs): 
     """ 
     Check username and password correspond to a valid and active User, if fails 
     try Facebook token authentication 
     """ 
     u = authenticate(username=username, password=password) 
     if u is None or not u.is_active: 
      u = authenticate_with_facebook() 

     if u is not none and u.is_active: 
      request.user = u 
      return True 

     return False 

,那麼你必須告訴DOT使用你的類,而不是默認的把這樣的事情在您的設置:

OAUTH2_PROVIDER = { 
    # other DOT settings 
    'OAUTH2_VALIDATOR_CLASS': 'your_app_name.MyOAuth2Validator', 
} 

HTH

+1

我認爲這是更好地使另一個認證後端。我認爲它更好,因爲你不需要重寫庫。 'APP.backends.FacebookBackend', 'django.contrib.auth.backends.ModelBackend'。所以首先嚐試使用Facebook後端進行身份驗證,然後使用正常的身份驗證後端進行身份驗證。如果有人想要詳細說明如何做到這一點,就問我。 :) –

+0

@RodrigoLópez我正在努力解決幾乎相同的問題,你能否啓發我,你是如何解決它的? – arnold

+0

@arnold嗨!就像我在之前的評論中評論的那樣,我認爲更好的選擇是使用另一個後端。在設置文件中,你聲明另一個後端是這樣的:AUTHENTICATION_BACKENDS =( 'project.backends.FacebookBackend', 'django.contrib.auth.backends.ModelBackend' )然後你創建你的文件backends.py與類FacebookBackend ,使用該方法進行身份驗證,您可以完成身份驗證所需的所有邏輯。我希望你瞭解我,如果你不知道,告訴我,我給你的文件的例子。 –