Authorization/Authentication 微服务架构

Authorization/Authentication in Microservice Architecture

我有:

User-Authentication 微服务有一个 REST API,我可以通过它管理用户(create/delete 用户、更新用户数据、获取所有用户列表、检查用户密码等)

现在我需要执行 authorization/authentication:

myApp 应用程序无法直接访问用户数据库,所有通信仅通过用户身份验证微服务处理。

在过去的一周里,我在 REST APIs 中广泛阅读了有关 authorization/authentication 的内容,但仍然无法弄清楚 如何构建实体 authorization/authentication user -> myAppmyApp -> User-Authentication Microservice.

系统

这是我目前想到的。

注册 (Diagram):

  1. 用户注册发送 username/password/other 数据到 myApp
  2. myApp 将 username/password/other 数据发送到用户身份验证微服务
  3. 用户身份验证微服务在用户数据库中创建一个新用户

登录(Diagram):

  1. 现在,用户登录发送 username/password 到 myApp
  2. myApp 将 username/password 发送到验证 username/password
  3. 的用户身份验证微服务
  4. 如果用户名和密码正确,User-Authentication 微服务会生成 API Key(随机字符串)并将其保存到用户数据库中,并将此 API Key 与用户记录相关联:
    username | password | email | address | APIKEY
    ---------+----------+-------+---------+-----------
    steve    | n8Y5e... | ...   | ...     | D4ED43...   
    
  5. 然后用户身份验证微服务returns将API密钥(+关于它所属用户的一些附加信息)保存到myApp
  6. myApp创建一个新的session存储在Redis中:生成session ID并将session ID + API key + 其他session数据保存到Redis:
    sessionID: 9w72tv3MHZD...
    
    session_data: {
      "cookie": {
        "originalMaxAge": ...,
        "expires": ...,
        "httpOnly":true,
        "path": ...
      },
    
      "user": {
        "authenticated": true,
        "username":"steve",
        "apiKey": D4ED43C0...,        
        "created": ...
      }
    }
    
    expire: ...
    
  7. 最后,myApp 服务器发送一个包含会话 ID 的 cookie 的响应。
  8. 完成,用户已登录。

根据每个后续请求 (Diagram):

  1. 用户发送包含会话 ID 的 cookie
  2. myApp 服务器将会话 ID 与存储在 Redis 中的会话 ID 进行比较。
  3. 如果它们匹配,myApp 再次查看会话数据,检索与会话 ID 关联的 API 密钥并将此 API 密钥发送到用户身份验证微服务
  4. User-Authentication 微服务通过 API 键在用户数据库中查找用户。如果提供 API 密钥存在,这意味着与此 API 密钥关联的用户已通过身份验证。
  5. 用户身份验证微服务通过向 myApp
  6. 返回类似 { authenticated: true, username: "steve" } 的内容来授予访问权限
  7. myApp 使用此响应 grant/restrict 访问 pages/app 功能

注销 (Diagram)(前 4 个步骤与上面“根据每个后续请求”完全相同):

  1. 用户发送包含会话 ID 的 cookie
  2. myApp 服务器将会话 ID 与存储在 Redis 中的会话 ID 进行比较。
  3. 如果它们匹配,myApp 再次查看会话数据,检索与会话 ID 关联的 API 密钥并将此 API 密钥发送到用户身份验证微服务
  4. User-Authentication 微服务通过 API 键在用户数据库中查找用户。如果提供的 API 密钥存在,则表示与此 API 密钥关联的用户已通过身份验证。
  5. User-Authentication 微服务从用户数据库中删除 API 密钥,并向 myApp
  6. 响应类似 { authenticated: false } 的内容
  7. myApp 发现用户未通过身份验证并从 Redis 中删除所有会话数据。
  8. myApp 还通过将其到期日期设置为过去来“删除”cookie,并且用户已注销。

问题:我做错了吗?我应该改变什么?我以前从未为 API 构建过身份验证,因此我将不胜感激任何建议。我想了解“大局”。

您应该使用基于令牌的身份验证。你的流程应该是这样的:

1- 用户在您的身份验证微服务中注册。

2- 用户将用户名和密码发送到身份验证微服务并接收不记名令牌。

3- 用户将收到的承载令牌发送到每个端点 (api),每个微服务都应该使用该令牌对用户进行身份验证。

您也可以仅在 ApiGateway 中配置身份验证。在这种方法中,当用户从身份验证微服务接收到持有者令牌时,他会调用您的 ApiGateway 以访问特定资源,ApiGateway 对用户进行身份验证并将请求路由到适当的微服务。请注意,在这种方法中,除 ApiGateway 之外的微服务不应具有 public 地址。