设置 OAuth2 以进行微服务身份验证的正确方法

问题描述 投票:0回答:2

背景资料

我有一个通过 REST API 处理用户身份验证的微服务,前端微服务联系此身份验证微服务 (AMS),一切工作正常。

主要问题

我想合并基于 Oauth2 的登录选项,但我有点不知道如何为微服务架构正确设置它。

我计划使用策略模式来支持Oauth2。下面是我当前的上下文,支持默认的基于 JWT 的策略。计划只是让用户通过 Oauth2 提供商登录,然后将刷新/访问令牌存储在数据库中以供将来登录,同时继续颁发我自己的基于 JWT 的访问和刷新令牌以进行授权。

class AuthenticationContext:
    def __init__(self, authentication_service):
        self.authentication_service = authentication_service

    def set_authentication_strategy(self, strategy):
        self.authentication_service = strategy

    def login(self, request):
        return self.authentication_service.login(request)

    def logout(self, request):
        return self.authentication_service.logout(request)

    def validate_token(self, request):
        return self.authentication_service.validate_token(request)

    def refresh(self, request):
        return self.authentication_service.refresh(request)

    def register(self, request):
        return self.authentication_service.register(request)
+... 

主要关注点

我是否需要设置一个 前端来与 oauth2 提供商(比如说 Google)交换授权令牌,然后 将该授权令牌发送到 AMS,然后让 AMS 使用授权令牌并将其交换从 Oauth2 提供商访问和刷新令牌?

在这种情况下,这是否意味着我必须向 oauth2 提供商注册两个微服务(前端和 AMS),以便一个可以请求代码,另一个可以交换它?

是否更建议将前端代码(React + ChakraUI)用于登录并注册到AMS(python)?

是否有两者兼而有之的替代方案或正确的方法?

附加信息

我愿意接受其他建议和推荐,而且我不熟悉微服务架构中的身份验证和授权。

This是我当前默认策略的序列图。

python authentication oauth-2.0 jwt microservices
2个回答
1
投票

一个看似微不足道但却是重要细节的快速注释:

  • OAuth 2.0 = 授权
  • OIDC(位于 OAuth 2.0 之上)= 身份验证

不过,如果您仅进行授权与授权和身份验证,则流程本质上是相同的(OIDC 添加了附加参数)。

目前最佳实践是授权码流程。某些情况下需要补充PKCE,但不管怎样,拥有它也没什么坏处。

由于您有可用的后端,因此事情变得容易一些,因为 PKCE 并不是绝对必要的。

后端通过使用授权请求将前端/浏览器/用户代理重定向到 OAuth 2.0 提供商的授权端点来启动登录。用户进行身份验证和授权,然后提供商将其重定向回重定向 URI,该 URI 应指向您的应用程序(前端)。

通过此重定向,将会有一个授权代码。它应该在 url 的查询参数中。前端将其提供给后端。

接下来,后端直接调用提供者以交换令牌的授权代码(用于授权的访问令牌和用于身份验证的 id 令牌)。令牌应该在响应中直接返回到您的后端。

一旦您的后端验证了这些令牌(通过提供程序上的某个端点或通过您自己验证签名),您现在就拥有了经过身份验证的用户,并且可以访问由范围参数指定的用户授权的资源。


0
投票

接受的答案对于用例来说是不正确的。授权适用于 OATH2 PROVIDER 的 api。不适用于操作的 api。

© www.soinside.com 2019 - 2024. All rights reserved.