【问题标题】:Logging out the current user in social user在社交用户中注销当前用户
【发布时间】:2019-09-05 01:43:06
【问题描述】:

我正在覆盖社交核心中的社交用户,但如何注销当前用户?如果我注销与社交身份验证链接的请求,我会收到一条错误消息,指出“AnonymousUser”对象没有属性“social_auth”。

def social_user(backend, uid, user=None, *args, **kwargs):
    provider = backend.name
    social = backend.strategy.storage.user.get_social_auth(provider, uid)
    if social:
        if user and social.user != user:
            logout(backend.strategy.request)

有什么想法吗?

【问题讨论】:

    标签: django logout python-social-auth


    【解决方案1】:

    这里最大的问题是您希望注销意味着什么。如果用户通过他们的 Google 帐户登录到您的应用程序,他们可能不想在使用自己的笔记本电脑、平板电脑或台式机的情况下从 Google 注销。

    出于这个原因,python-social-auth 不包含注销逻辑,OAuth2 也确实不包含,但 Django 和 Flask 都包含一个注销机制,您可以使用该机制仅从您的 Web 应用程序中注销。

    您已标记 django,因此您可以将 django.contrib.auth.views.LogoutView 作为您的 URL 之一,并将您的“退出”功能链接到该 URL,或者您可以编写自己的 URL,并在调用 django.contrib.auth.logout 中的某个位置.向用户确认他们已注销通常是友好的,并提供某种简单的模板页面来确认他们已注销;这是我上面提到的那个视图django.contrib.auth.views.LogoutView 的功能。

    如果您想走得更远,如果您支持多个这样的后端,则用于每个后端的 URL 可能会非常困难。有关这方面的更多信息,请参阅Logout link with return URL (OAuth)

    您还应该做一些事情来确定用户是否想要完全注销;因为这在 OAuth2 中并不典型。您的解决方案将需要某种用户界面元素。以下是一些可能性:

    • 您可以在他们注销之前通过表单询问他们 - “[ ] 您想完全从 Google 注销吗?”。当表单被发回时,您决定是否重定向到 Google 的注销 URL。这有点安全风险,因为他们可能会点击退出然后去吃午饭。
    • 之后您可以简单地让他们知道他们已从您的应用程序中注销,但并未从 google 中注销。同样,这可能存在安全风险。
    • 您可以间接询问他们登录时想要做什么。也许您会在社交后端按钮列表之前显示一个登录界面,其中包含一个复选框,例如“[ ] 这是我信任的计算机”,然后将该按钮检查保存在会话中。然后,当他们退出时,您只需执行此操作即可保持“与用户的合同”。

    因为python-social-auth有这么优秀的settings mechanism,你可以在设置中存储一个后端特定的LOGOUT_URL,例如:

    SOCIAL_AUTH_GOOGLE_OAUTH2_LOGOUT_URL='https://www.google.com/accounts/Logout'
    

    再次了解如何继续返回确认 URL,请参阅 Logout link with return URL (OAuth)

    【讨论】:

      【解决方案2】:

      我在下面的回答很长,而且很完整。最简单的答案是 python-social-auth 不处理注销,因为 OAuth2 不处理注销。要注销您自己的应用程序,只需基于django.contrib.auth.views.LogoutView 编写您自己的视图,以便您可以干净地覆盖模板:

      from django.contrib.auth.views import LogoutView
      
      # ...
      
      class MyLogoutView(LogoutView):
          template_name = 'myapp/logout.html'
      
      mylogout_view = MyLogoutView.as_view()
      

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 2017-07-21
        • 2017-04-30
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        相关资源
        最近更新 更多