2015-12-23 4 views
0

Я использую API OAUTH для проверки доступа к календарю Google пользователей. Они не регистрируются в моей системе, используя OAUTH, просто принимая мой сайт для доступа к их данным.OAUTH2gВыход пользователя из их сеанса Django

Проблема заключается в том, что если пользователь вышел из своей учетной записи google и после того, как он набрал подтверждение, он отключает их из сеанса, и у меня нет способа связать их с резервным копированием.

Это работает, если они уже вошли в учетную запись google в своем браузере и нажали кнопку accept, они будут перенаправлены на нужную страницу.

Я повторяю ошибку, когда кеш, куки-файлы ясны, и они должны переучиться в свою учетную запись google для проверки.

Я попытался сохранить идентификатор сеанса и т. Д., Но параметр запроса не содержит те же данные запроса, что и исходное представление, поэтому в данных, которые я пытаюсь получить, возникает конфликт.

Пользователь вошел в систему, используя стандартные библиотеки Django для модели учетных данных.

КОД

FLOW = flow_from_clientsecrets(
    CLIENT_SECRETS, 
    scope='https://www.googleapis.com/auth/calendar.readonly', 
    redirect_uri='http://127.0.0.1:8000/oauth2callback') 

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''» '' '' '' '' ' Основная функция, связанная с верификацией auth ' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '

def index(request): 
    current_user = User.objects.get(username=request.user.username) 
    storage = Storage(CredentialsModel, 'id', current_user, 'credential') 
    credential = storage.get() 
    if credential is None or credential.invalid == True: 
    FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY, 
                request.user.id) 
    authorize_url = FLOW.step1_get_authorize_url() 
    return redirect(authorize_url) 

'' '' '' '' '' '' ''' «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «»» '' '' '' ' Пользователь затем вызывает функцию данных после аутентификации ' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '' '' '

def auth_return(request): 

    print("THE CURRENTLY REQUESTED USER IN THIS SESSION REQUEST IS %s"%(request.user.username)) 

    credential = FLOW.step2_exchange(request.REQUEST) 
    try: 
     current_user = User.objects.get(id=request.user.id) 
    except: 
     return HttpResponseRedirect("/login") 

    storage = Storage(CredentialsModel, 'id', current_user, 'credential') 
    storage.put(credential) 
    return HttpResponseRedirect("/get_cal") 

ответ

0

Хорошо, так что это было немного больше, чем я думал.

Я исправил это, добавив параметр состояния текущего имени пользователя.

logged_in_username = request.user.username 
user_data = {'var_test' : logged_in_username} 
pass_param = urllib.urlencode(user_data) 
FLOW.params['state']=pass_param 
authorize_url = FLOW.step1_get_authorize_url() 

Это дало мне возможность запрашивать пользователя из БД через пользовательскую модель в Django contrib. Я разобран государственный вар из URL:

#Get the currently logged in username 
user_variable_data = str(FLOW.params['state']) 

#get rid of the var_test= preprended text data for parsing reasons 
user_variable_data = user_variable_data[9:] 

#Get that user from the database in the form of a user object 
current_user = User.objects.get(username=user_variable_data) 

, а затем построил собственный файл аутентификация бэкенда авторизовать пользователь без пароля, чтобы сохранить запрос как ничего странного никогда даже произошли.

user = authenticate(username=user_variable_data) 
login(request, user) 
print("AUTHENTICATED") 

Добавив это файл настроек

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'procrastinate.auth_backend.PasswordlessAuthBackend', 
) 

Пользовательские Backend Файл

из django.contrib.auth.backends импорта ModelBackend из django.contrib.auth.models Импорт пользователя

класс PasswordlessAuthBackend (ModelBackend): "" "Войдите в Django без предоставления пароля.

""" 
def authenticate(self, username=None): 
    try: 
     return User.objects.get(username=username) 
    except User.DoesNotExist: 
     return None 

def get_user(self, user_id): 
    try: 
     return User.objects.get(pk=user_id) 
    except User.DoesNotExist: 
     return None