Authorization/Authentication 微服务架构
Authorization/Authentication in Microservice Architecture
我有:
- 我的应用程序(服务器 1)
- 用户认证微服务+用户数据库(服务器2)
User-Authentication 微服务有一个 REST API,我可以通过它管理用户(create/delete 用户、更新用户数据、获取所有用户列表、检查用户密码等)
现在我需要执行 authorization/authentication:
- 在 user 和 myApp 之间(为此我将使用常规会话(只包含会话 ID 的 cookie)并将会话数据存储在 Redis 中)
- 在 myApp 和用户身份验证微服务之间(为此我假设我需要使用某种 API Key/token)
myApp 应用程序无法直接访问用户数据库,所有通信仅通过用户身份验证微服务处理。
在过去的一周里,我在 REST APIs 中广泛阅读了有关 authorization/authentication 的内容,但仍然无法弄清楚 如何构建实体 authorization/authentication user -> myApp 和 myApp -> User-Authentication Microservice.
系统
这是我目前想到的。
注册 (Diagram):
- 用户注册发送 username/password/other 数据到 myApp
- myApp 将 username/password/other 数据发送到用户身份验证微服务
- 用户身份验证微服务在用户数据库中创建一个新用户
登录(Diagram):
- 现在,用户登录发送 username/password 到 myApp
- myApp 将 username/password 发送到验证 username/password
的用户身份验证微服务
- 如果用户名和密码正确,User-Authentication 微服务会生成 API Key(随机字符串)并将其保存到用户数据库中,并将此 API Key 与用户记录相关联:
username | password | email | address | APIKEY
---------+----------+-------+---------+-----------
steve | n8Y5e... | ... | ... | D4ED43...
- 然后用户身份验证微服务returns将API密钥(+关于它所属用户的一些附加信息)保存到myApp
- 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: ...
- 最后,myApp 服务器发送一个包含会话 ID 的 cookie 的响应。
- 完成,用户已登录。
根据每个后续请求 (Diagram):
- 用户发送包含会话 ID 的 cookie
- myApp 服务器将会话 ID 与存储在 Redis 中的会话 ID 进行比较。
- 如果它们匹配,myApp 再次查看会话数据,检索与会话 ID 关联的 API 密钥并将此 API 密钥发送到用户身份验证微服务
- User-Authentication 微服务通过 API 键在用户数据库中查找用户。如果提供
API 密钥存在,这意味着与此 API 密钥关联的用户已通过身份验证。
- 用户身份验证微服务通过向 myApp
返回类似 { authenticated: true, username: "steve" }
的内容来授予访问权限
- myApp 使用此响应 grant/restrict 访问 pages/app 功能
注销 (Diagram)(前 4 个步骤与上面“根据每个后续请求”完全相同):
- 用户发送包含会话 ID 的 cookie
- myApp 服务器将会话 ID 与存储在 Redis 中的会话 ID 进行比较。
- 如果它们匹配,myApp 再次查看会话数据,检索与会话 ID 关联的 API 密钥并将此 API 密钥发送到用户身份验证微服务
- User-Authentication 微服务通过 API 键在用户数据库中查找用户。如果提供的 API 密钥存在,则表示与此 API 密钥关联的用户已通过身份验证。
- User-Authentication 微服务从用户数据库中删除 API 密钥,并向 myApp
响应类似 { authenticated: false }
的内容
- myApp 发现用户未通过身份验证并从 Redis 中删除所有会话数据。
- myApp 还通过将其到期日期设置为过去来“删除”cookie,并且用户已注销。
问题:我做错了吗?我应该改变什么?我以前从未为 API 构建过身份验证,因此我将不胜感激任何建议。我想了解“大局”。
您应该使用基于令牌的身份验证。你的流程应该是这样的:
1- 用户在您的身份验证微服务中注册。
2- 用户将用户名和密码发送到身份验证微服务并接收不记名令牌。
3- 用户将收到的承载令牌发送到每个端点 (api),每个微服务都应该使用该令牌对用户进行身份验证。
您也可以仅在 ApiGateway 中配置身份验证。在这种方法中,当用户从身份验证微服务接收到持有者令牌时,他会调用您的 ApiGateway 以访问特定资源,ApiGateway 对用户进行身份验证并将请求路由到适当的微服务。请注意,在这种方法中,除 ApiGateway 之外的微服务不应具有 public 地址。
我有:
- 我的应用程序(服务器 1)
- 用户认证微服务+用户数据库(服务器2)
User-Authentication 微服务有一个 REST API,我可以通过它管理用户(create/delete 用户、更新用户数据、获取所有用户列表、检查用户密码等)
现在我需要执行 authorization/authentication:
- 在 user 和 myApp 之间(为此我将使用常规会话(只包含会话 ID 的 cookie)并将会话数据存储在 Redis 中)
- 在 myApp 和用户身份验证微服务之间(为此我假设我需要使用某种 API Key/token)
myApp 应用程序无法直接访问用户数据库,所有通信仅通过用户身份验证微服务处理。
在过去的一周里,我在 REST APIs 中广泛阅读了有关 authorization/authentication 的内容,但仍然无法弄清楚 如何构建实体 authorization/authentication user -> myApp 和 myApp -> User-Authentication Microservice.
系统这是我目前想到的。
注册 (Diagram):
- 用户注册发送 username/password/other 数据到 myApp
- myApp 将 username/password/other 数据发送到用户身份验证微服务
- 用户身份验证微服务在用户数据库中创建一个新用户
登录(Diagram):
- 现在,用户登录发送 username/password 到 myApp
- myApp 将 username/password 发送到验证 username/password 的用户身份验证微服务
- 如果用户名和密码正确,User-Authentication 微服务会生成 API Key(随机字符串)并将其保存到用户数据库中,并将此 API Key 与用户记录相关联:
username | password | email | address | APIKEY ---------+----------+-------+---------+----------- steve | n8Y5e... | ... | ... | D4ED43...
- 然后用户身份验证微服务returns将API密钥(+关于它所属用户的一些附加信息)保存到myApp
- 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: ...
- 最后,myApp 服务器发送一个包含会话 ID 的 cookie 的响应。
- 完成,用户已登录。
根据每个后续请求 (Diagram):
- 用户发送包含会话 ID 的 cookie
- myApp 服务器将会话 ID 与存储在 Redis 中的会话 ID 进行比较。
- 如果它们匹配,myApp 再次查看会话数据,检索与会话 ID 关联的 API 密钥并将此 API 密钥发送到用户身份验证微服务
- User-Authentication 微服务通过 API 键在用户数据库中查找用户。如果提供 API 密钥存在,这意味着与此 API 密钥关联的用户已通过身份验证。
- 用户身份验证微服务通过向 myApp 返回类似
- myApp 使用此响应 grant/restrict 访问 pages/app 功能
{ authenticated: true, username: "steve" }
的内容来授予访问权限
注销 (Diagram)(前 4 个步骤与上面“根据每个后续请求”完全相同):
- 用户发送包含会话 ID 的 cookie
- myApp 服务器将会话 ID 与存储在 Redis 中的会话 ID 进行比较。
- 如果它们匹配,myApp 再次查看会话数据,检索与会话 ID 关联的 API 密钥并将此 API 密钥发送到用户身份验证微服务
- User-Authentication 微服务通过 API 键在用户数据库中查找用户。如果提供的 API 密钥存在,则表示与此 API 密钥关联的用户已通过身份验证。
- User-Authentication 微服务从用户数据库中删除 API 密钥,并向 myApp 响应类似
- myApp 发现用户未通过身份验证并从 Redis 中删除所有会话数据。
- myApp 还通过将其到期日期设置为过去来“删除”cookie,并且用户已注销。
{ authenticated: false }
的内容
问题:我做错了吗?我应该改变什么?我以前从未为 API 构建过身份验证,因此我将不胜感激任何建议。我想了解“大局”。
您应该使用基于令牌的身份验证。你的流程应该是这样的:
1- 用户在您的身份验证微服务中注册。
2- 用户将用户名和密码发送到身份验证微服务并接收不记名令牌。
3- 用户将收到的承载令牌发送到每个端点 (api),每个微服务都应该使用该令牌对用户进行身份验证。
您也可以仅在 ApiGateway 中配置身份验证。在这种方法中,当用户从身份验证微服务接收到持有者令牌时,他会调用您的 ApiGateway 以访问特定资源,ApiGateway 对用户进行身份验证并将请求路由到适当的微服务。请注意,在这种方法中,除 ApiGateway 之外的微服务不应具有 public 地址。