为微服务的身份验证设置OAuth2的正确方法

ipakzgxi  于 2023-08-02  发布在  其他
关注(0)|答案(1)|浏览(118)

背景信息

我有一个通过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是我当前默认策略的序列图。

7kqas0il

7kqas0il1#

一个看起来很小但很重要的小提示:

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

但是,如果您只执行授权,而不是授权和身份验证,则流程基本相同(OIDC添加了其他参数)。
目前的最佳实践是授权代码流。在某些情况下,它需要与PKCE一起补充,但无论如何都不会伤害它。
由于您有一个可用的后端,这使事情变得更容易,因为PKCE不是严格必要的。
后端通过使用授权请求将前端/浏览器/用户代理重定向到OAuth 2.0提供者的授权端点来启动登录。用户进行身份验证和授权,然后由提供程序重定向回重定向URI,该URI应指向您的应用(前端)。
这个重定向会有一个授权码它应该在url的查询参数中。前端将此功能提供给后端。
接下来,后端直接调用提供者以交换令牌的授权代码(用于授权的访问令牌和用于身份验证的id令牌)。令牌应该在响应中直接返回到您的后端。
一旦您的后端验证了这些令牌,无论是通过提供程序上的某个端点,还是通过自己验证签名,您现在就拥有了一个经过身份验证的用户,并可以访问由scope参数指定的用户授权的资源。

相关问题