python-social-auth 是否需要会话

2023-12-30

我正在构建一个带有 API 后端(使用 DRF 构建)和 angularjs 客户端的 django 应用程序。我的目标是使用 JWT 代替会话来完全解耦服务器和客户端。我正在尝试整合python-社交-身份验证 https://github.com/omab/python-social-auth(PSA)与django-rest-framework-jwt https://github.com/GetBlimp/django-rest-framework-jwt(DRFJWT),所以我的目标是让身份验证流程达到以下目的:

用户通过 Angular 客户端使用电子邮件/facebook 登录 -> 客户端将表单发布到 PSA 的 url -> PSA 登录/创建用户 ->[!] DRFJWT 创建令牌,然后将其发送回客户端 -> 客户端将令牌存储在本地存储中,然后使用令牌每个请求

[!]:这就是我目前正在努力的地方。我的想法是我可以修改完成 https://github.com/omab/python-social-auth/blob/master/social/actions.py#L28PSA 中的方法就像这样

from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handler


def do_complete(backend, login, user=None, redirect_name='next',
            *args, **kwargs):
  # pop redirect value before the session is trashed on login()
  data = backend.strategy.request_data()
  redirect_value = backend.strategy.session_get(redirect_name, '') or \
                 data.get(redirect_name, '')

  is_authenticated = user_is_authenticated(user)
  user = is_authenticated and user or None

  partial = partial_pipeline_data(backend, user, *args, **kwargs)
  if partial:
      xargs, xkwargs = partial
      user = backend.continue_pipeline(*xargs, **xkwargs)
  else:
      user = backend.complete(user=user, *args, **kwargs)

  if user_is_active(user):
      # catch is_new/social_user in case login() resets the instance
      is_new = getattr(user, 'is_new', False)
      social_user = user.social_user
      login(backend, user, social_user)

  payload = jwt_payload_handler(user)
  return { 'token': jwt_encode_handler(payload) }

这是实现我想要实现的目标的唯一方法吗?

我还想知道从最佳实践的角度来看,使用会话来管理管道和 JWT 进行身份验证是否可以?


我也在用python-社交-身份验证 https://github.com/omab/python-social-auth and django-rest-framework-jwt https://github.com/GetBlimp/django-rest-framework-jwt用于用户身份验证。

我能够将两个身份验证系统集成在一起的方法是创建一个自定义视图,该视图包含“访问令牌' 由 oAuth 提供商提供并尝试使用它创建新用户。创建用户后,我不会返回经过身份验证的用户/会话,而是返回 JWT 令牌。

以下代码片段解释了该解决方案。

Back-End

In my views.py文件我包含以下内容:

@psa()
def auth_by_token(request, backend):
    """Decorator that creates/authenticates a user with an access_token"""
    token = request.DATA.get('access_token')
    user = request.user
    user = request.backend.do_auth(
            access_token=request.DATA.get('access_token')
        )
    if user:
        return user
    else:
        return None

class FacebookView(views.APIView):
    """View to authenticate users through Facebook."""

    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):
        auth_token = request.DATA.get('access_token', None)
        backend = request.DATA.get('backend', None)
        if auth_token and backend:
            try:
                # Try to authenticate the user using python-social-auth
                user = auth_by_token(request, backend)
            except Exception,e:
                return Response({
                        'status': 'Bad request',
                        'message': 'Could not authenticate with the provided token.'
                    }, status=status.HTTP_400_BAD_REQUEST)
            if user:
                if not user.is_active:
                    return Response({
                        'status': 'Unauthorized',
                        'message': 'The user account is disabled.'
                    }, status=status.HTTP_401_UNAUTHORIZED)
                
                # This is the part that differs from the normal python-social-auth implementation.
                # Return the JWT instead.

                # Get the JWT payload for the user.
                payload = jwt_payload_handler(user)

                # Include original issued at time for a brand new token,
                # to allow token refresh
                if api_settings.JWT_ALLOW_REFRESH:
                    payload['orig_iat'] = timegm(
                        datetime.utcnow().utctimetuple()
                    )

                # Create the response object with the JWT payload.
                response_data = {
                    'token': jwt_encode_handler(payload)
                }

                return Response(response_data)
        else:
            return Response({
                    'status': 'Bad request',
                    'message': 'Authentication could not be performed with received data.'
            }, status=status.HTTP_400_BAD_REQUEST)

In my urls.py我包括以下路线:

urlpatterns = patterns('',
    ...
    url(r'^api/v1/auth/facebook/', FacebookView.as_view()),
    ...
)

前端

现在后端身份验证已连接,您可以使用任何前端库发送 access_token 并对用户进行身份验证。就我而言,我使用了AngularJS.

在控制器文件中,我像这样调用 API:

/**
 * This function gets called after successfully getting the access_token from Facebook's API.
 */
function successLoginFbFn(response) {
    var deferred = $q.defer();
    $http.post('/api/v1/auth/facebook/', {
        "access_token": response.authResponse.accessToken, 
        "backend": "facebook"
    }).success(function(response, status, headers, config) {
        // Success
        if (response.token) {
            // Save the token to localStorage and redirect the user to the front-page.
            Authentication.setToken(response.token);
            window.location = '/';
        }
        deferred.resolve(response, status, headers, config);
    }).error(function(response, status, headers, config) {
        // Error
        console.error('Authentication error.');
        deferred.reject(response, status, headers, config);
    });
}

通过这种方法,您可以混合使用这两个插件。所有发送的代币将来自django-rest-framework-jwt即使用户仍然可以通过 Facebook、Google、Twitter 等网站提供的身份验证自己的身份。

我只展示了通过 Facebook 进行身份验证的方法,但是您可以对其他提供商采用类似的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python-social-auth 是否需要会话 的相关文章

随机推荐

  • 具有客户端证书身份验证的.Net Core Web API

    我在 Net Core 2 1中开发了一个简单的WEB API服务 我正在尝试实现客户端证书身份验证 因此我只能向在其计算机上安装了特定证书的客户端授予对 API 的访问权限 客户端使用浏览器 Chrome Edge IE11 或 Fire
  • 从n中选择k

    我想选择k元素均匀地随机地从可能的n无需两次选择相同的数字 对此有两种简单的方法 列出所有内容n的可能性 随机播放它们 你不需要 洗牌所有n数字只是k其中通过执行第一个k费希尔 耶茨 Fisher Yates 的脚步 选择第一个k 这种方法
  • Mockito java.lang.Exception:当我在测试中使用内部类时,类应该是公共的

    我有以下测试 RunWith Enclosed class public class ProductTest RunWith MockitoJUnitRunner class Ignore public static abstract cl
  • 避免代码重复的最佳方法是定义比较运算符“<、<=、>、>=、==、!=”,但要考虑 NaN?

    我数学 x lt y相当于 x gt y 对于浮点运算来说也是如此 在多数情况下 但不总是 什么时候x or y是 NaN x lt y is not相当于 x gt y 因为比较NaN任何事物总会有回报false 但仍然 x lt y l
  • 动态修补(处理创建时传递的变量)有哪些替代方案?

    我听说有人将动态修补描述为一种黑客行为 或者在 Pd 的未来版本中存在破坏的风险 这是足够合理的 但这似乎意味着在构建抽象时还有其他选择 动态修补似乎对于实例化可变数量的对象和连接到可变数量的入口和出口 在创建时定义的数字 我个人不需要在事
  • 在自定义 Cocoapods 中使用故事板和图像资源

    我正在尝试使用 cocoa pod 模块化一个大型 iOS 项目 正在 Swift 中开发 这个想法是创建 子应用程序 其中包含可以集成到主项目中的故事板和资产 在这种情况下 我在使用故事板时遇到了麻烦 这个问题类似于 我认为 https
  • Mojarra Java EE 5/6 兼容性

    非常简单的问题 是否有人有关于 Mojarra JSF RI 与 Java EE 5 和 6 标准兼容性的 官方 信息的链接 我似乎找不到任何与此有关的信息 我们被 Java EE 5 应用程序服务器困住了 我们想知道可以使用哪个版本的 M
  • 从 Python 中使用 jar 运行 Java 程序

    我正在尝试使用 Python 中的 jar 运行 java 文件 我首先运行命令 java classpath Users blablalba jackson all 1 9 0 jar parseJason 它工作得很好 然后我编写了一个
  • 当我更改一行的值时,连续形式的 MS Access 组合框会更改所有行的值

    过去两个小时我一直在尝试解决这个问题 但没有成功 所以我希望你能帮助我解决这个问题 我有一个连续的表单 一次显示多行 我在表单中添加了一个组合框 显示一些可以从另一个表中选择的值 同时显示同一个表中的默认值 问题是 一旦我更改表单中一个组合
  • 如何使用 Erlang file:read_file_info 权限/模式信息?

    Erlang 文档为file read file info 1声明 文件权限是总和 和 其他位 可以设置 而不是灌输信心 而且 谷歌一直不是我的朋友 我希望采用返回的模式file read file info 1 e g 33188 在 L
  • 比较受歧视的工会

    我是 F 的新手 正在尝试 FParsec 我会使用 FParsec 生成 AST 我想使用 FsUnit 围绕解析器的各个部分编写一些测试 以确保正确运行 我在语法上遇到了一些麻烦 抱歉 确切的代码正在工作 我可以稍后发布一个具体的示例
  • 无法反序列化当前 JSON 对象(空数组)

    我正在尝试制作一个将所有这些对象格式化为树视图的程序 为此 我使用 JSON 来排序对象 我需要解析 JSON 所以我选择了 JSON NET 下面是一个格式化示例 Space ClassName SpaceObject Name Spac
  • 所有指针都保证能正确地往返 void * 吗?

    在C语言中 是否保证任何指针类型都可以往返void 成功地 也就是说 像下面这样的东西保证可以工作 typedef struct A A p void v p A p2 v use p2 here 无论什么类型A 对象指针确实可以通过voi
  • NUnit Assert.Equals 与 Assert.AreEqual

    有什么区别 Assert Equals and Assert AreEqual Assert NotNull and Assert IsNotNull Assert Equals 是对象比较 Assert AreEquals 被重载以比较
  • 在 Node 模块导出的函数上使用 `jest.spyOn`

    In Jest https jestjs io 为了监视 并可选择模拟实现 方法 我们执行以下操作 const childProcess require child process const spySpawnSync jest spyOn
  • 使用 .NET 获得快速 RPC 的最简单方法?

    在 NET 中获取 RPC 最简单的方法是什么 我看到有 NET Remoting和WCF 根据维基百科 WCF是 NET Remoting的后继者 到目前为止 我只尝试了远程处理的东西 这似乎非常简单 到目前为止 我也没有遇到任何应用程序
  • 如何对每一行执行语句并返回整个结果

    这是上一个问题的延续 查找具有匹配行的组 https stackoverflow com questions 42700771 find groups with matching rows 我有一张表 其中包含人和他们拥有的汽车 Name
  • (已解决)如何用jq读取100+GB的文件而不耗尽内存

    我有一个 100 GB 的 json 文件 当我尝试用 jq 读取它时 我的计算机继续运行我们的 ram 有没有办法在限制内存使用的同时读取文件 或者有其他方法来读取非常大的 json 文件 我在命令中输入的内容 jq keys fileN
  • 如何使用 Cabal 列出所有已安装的软件包及其版本?

    是否有一个简单的命令 选项可以让您做到这一点 我可以用grep但我想知道是否有内置选项 我们可以简单地这样做 cabal list installed
  • python-social-auth 是否需要会话

    我正在构建一个带有 API 后端 使用 DRF 构建 和 angularjs 客户端的 django 应用程序 我的目标是使用 JWT 代替会话来完全解耦服务器和客户端 我正在尝试整合python 社交 身份验证 https github