我有一个通过 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)?
是否有两者兼而有之的替代方案或正确的方法?
我愿意接受其他建议和推荐,而且我不熟悉微服务架构中的身份验证和授权。
一个看似微不足道但却是重要细节的快速注释:
不过,如果您仅进行授权与授权和身份验证,则流程本质上是相同的(OIDC 添加了附加参数)。
目前最佳实践是授权码流程。某些情况下需要补充PKCE,但不管怎样,拥有它也没什么坏处。
由于您有可用的后端,因此事情变得容易一些,因为 PKCE 并不是绝对必要的。
后端通过使用授权请求将前端/浏览器/用户代理重定向到 OAuth 2.0 提供商的授权端点来启动登录。用户进行身份验证和授权,然后提供商将其重定向回重定向 URI,该 URI 应指向您的应用程序(前端)。
通过此重定向,将会有一个授权代码。它应该在 url 的查询参数中。前端将其提供给后端。
接下来,后端直接调用提供者以交换令牌的授权代码(用于授权的访问令牌和用于身份验证的 id 令牌)。令牌应该在响应中直接返回到您的后端。
一旦您的后端验证了这些令牌(通过提供程序上的某个端点或通过您自己验证签名),您现在就拥有了经过身份验证的用户,并且可以访问由范围参数指定的用户授权的资源。
接受的答案对于用例来说是不正确的。授权适用于 OATH2 PROVIDER 的 api。不适用于操作的 api。