【问题标题】:OAUTH2gLogging user out of their session DjangoOAUTH2gLogging 用户退出他们的会话 Django
【发布时间】:2023-04-10 03:51:01
【问题描述】:

我正在使用 OAUTH API 来验证对用户谷歌日历的访问权限。他们没有使用 OAUTH 登录我的系统,只是接受我的网站访问他们的数据。

问题是,如果用户退出了他们的谷歌帐户,并且在他们点击验证后,它会强制他们退出他们的会话,我无法将他们重新链接起来。

如果他们已经在浏览器会话中登录到谷歌帐户并点击接受,这确实有效,他们将被重定向到正确的页面。

当缓存、cookie 被清除并且他们需要重新登录到他们的谷歌帐户进行验证时,我复制了错误。

我尝试存储会话ID等,但请求参数包含的请求数据与初始视图不同,因此我尝试检索的数据存在冲突。

用户使用凭证模型的标准 Django 库登录。

代码

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

''''''''''''''''''''''''''''''''''''''''''' '''' 处理身份验证的主要功能 ''''''''''''''''''''''''''''''''''''''''''''' '

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")

【问题讨论】:

    标签: python django google-calendar-api oauth2


    【解决方案1】:

    好的,所以这比我想象的要复杂一些。

    我通过添加当前登录用户名的状态参数来解决此问题。

    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',
    )
    

    自定义后端文件

    从 django.contrib.auth.backends 导入 ModelBackend from 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
    

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多