2014-02-12 51 views
3

我創建一個自定義提供從另一個內部項目獲得的oauth2令牌,過程幾乎是罰款,但我正在逐漸403 forbidden錯誤時,瀏覽器返回到我的項目,這個網址:Django的allauth給403禁止在回調

http://localhost:8001/account/connect/login/callback/?state=Nngd5Gu3JnB4&code=Rqqg91oEwQKDsvSyzZ8Az5fEeHGaEe#_=_ 

這裏是我的自定義提供了views.py:

import requests 
from allauth.socialaccount.providers.oauth2.views import (OAuth2Adapter, OAuth2LoginView, OAuth2CallbackView) 
from .provider import ConnectProvider 


class ConnectOAuth2Adapter(OAuth2Adapter): 
    provider_id = ConnectProvider.id 
    access_token_url = 'http://localhost:8000/o/token/' 
    authorize_url = 'http://localhost:8000/o/authorize/' 
    profile_url = 'http://localhost:8000/api/account/' 

    def complete_login(self, request, app, token, **kwargs): 
     _token = {'access_token':token.token} 
     resp = requests.get(self.profile_url, params={'access_token': token.token, 'alt': 'json'}) 
     extra_data = resp.json() 
     login = self.get_provider().sociallogin_from_response(request, extra_data) 
     return login 

oauth2_login = OAuth2LoginView.adapter_view(GoConnectOAuth2Adapter) 
oauth2_callback = OAuth2CallbackView.adapter_view(GoConnectOAuth2Adapter) 

回答

3

通過allauth源代碼去之後,我想通了,這個問題是由於會話:

@classmethod 
    def stash_state(cls, request): 
     state = cls.state_from_request(request) 
     verifier = get_random_string() 
     request.session['socialaccount_state'] = (state, verifier) 
     return verifier 



@classmethod 
    def verify_and_unstash_state(cls, request, verifier): 
     if 'socialaccount_state' not in request.session: 
      raise PermissionDenied()   
     state, verifier2 = request.session.pop('socialaccount_state') 
     if verifier != verifier2:  
      raise PermissionDenied()   
     return state 

基本上我有2個網站,一個是OAuth服務器(localhost:8000),另一個是OAuth客戶端(localhost:8001),最初客戶端將會話設置爲stash_state方法,然後瀏覽器重定向到服務器,都使用相同的域名,服務器將覆蓋會話並清除客戶端設置的會話。

+0

+1,那麼你是如何解決這個問題的? –

+0

只需使用不同的主機名啓動runserver實例即可 –