微服务架构中的授权/认证

时间:2020-06-21 05:37:59

标签: api rest authentication authorization microservices

我有:

  • myApp(服务器1)
  • 用户身份验证微服务+用户数据库(服务器2)

用户身份验证微服务具有REST API,通过它我可以管理用户(创建/删除用户,更新用户数据,获取所有用户的列表,检查用户密码等)

现在我需要执行授权/身份验证:

  • user和myApp 之间(为此,我将使用常规会话(仅包含会话ID的cookie)并将会话数据存储在Redis中)
  • myApp和用户身份验证微服务之间的
  • (为此,我假设我需要使用某种API密钥/令牌)

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

在过去的一周中,我一直在广泛阅读有关REST API中的授权/身份验证的信息,但是仍然不知道如何为用户-> myApp < / em>和 myApp->用户身份验证微服务

这是我目前想出的。

注册(Diagram):

  1. 用户注册将用户名/密码/其他数据发送到myApp
  2. myApp将用户名/密码/其他数据发送到用户身份验证微服务
  3. 用户身份验证微服务在用户数据库中创建一个新用户

登录(Diagram):

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

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

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

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

  1. 用户发送包含会话ID的cookie
  2. myApp服务器将会话ID与Redis中存储的会话ID进行比较。
  3. 如果它们匹配,则myApp再次调查会话数据,检索与会话ID关联的API密钥,然后将此API密钥发送给User-Authentication Microservice
  4. 用户身份验证微服务通过API密钥在“用户数据库”中查找用户。如果提供的API密钥存在,则意味着与此API密钥关联的用户已通过身份验证。
  5. 用户身份验证微服务从用户数据库中删除API密钥,并以类似{ authenticated: false }的方式对myApp进行响应
  6. myApp看到用户未通过身份验证,并从Redis中删除了所有会话数据。
  7. myApp还可以通过设置cookie的过期日期来“删除” cookie,并注销用户。

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

1 个答案:

答案 0 :(得分:0)

您应该使用基于令牌的身份验证。您的流程应如下所示:

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

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

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

您还可以仅在ApiGateway中配置身份验证。通过这种方法,当用户从身份验证微服务接收到承载令牌时,他将呼叫您的ApiGateway以访问特定资源,并且ApiGateway对用户进行身份验证并将请求路由到适当的微服务。请注意,在这种方法中,除ApiGateway之外的微服务不应具有公共地址。