微服务认证

时间:2015-06-25 07:53:17

标签: rest microservices

上下文

我有多种服务,例如:

  • 用户(LDAP或活动目录等...)
  • 结算
  • 规划
  • 等...
  • 验证

我需要连接我的微服务使用OAuth2.0,开始使用标准登录/密码(我使用自己的数据,而不是gettint第三站服务器)

问题

根据这些图片:

第1步

enter image description here

第2步

enter image description here

如何在authmicroservice之外的其他服务中处理access_token控制或授权控制?

4 个答案:

答案 0 :(得分:10)

为了在微服务架构中管理身份验证,您必须有不同的观点。

请记住,当您使用monolith时,您只有一个身份验证过程。

作为PHP应用程序中的一个示例,您可以在数据库中找到具有相应凭据的用户,然后您创建了一个用户“已通过身份验证”的会话。

使用微服务,工作流程有点相同。现在唯一改变的是您无法在不同的服务中打开会话。此外,您不需要获得经过身份验证的用户。您只需要确保他有权在您的微服务上执行当前呼叫。

感谢oauth2,拥有有效的access_token会为您提供此信息。

这应该回答前端部分。在后端部分(我的意思是在api网关后面),你不应该管理access_token,因为它与微服务无关。您可以使用功能键在微服务中查找与用户相关的任何信息,例如uuid。

为了在使用oauth2时获得uuid,我建议也使用openid connect。使用此协议的用户可以管理特定的用户信息,并且可以访问特定的端点“/ userinfo”。

希望这个架构能让这个答案更加清晰。

enter image description here

答案 1 :(得分:1)

我们的激活器中有微服务中的身份验证流程的教程和说明,它位于Scala中 - http://www.typesafe.com/activator/template/reactive-microservices(来源:https://github.com/theiterators/reactive-microservices

基本思想是:您需要为每个请求验证身份验证令牌的真实性。 你可以:

- 在代理(网关)中执行此操作

- 在结算微服务中执行此操作

我们倾向于做的是:在每个面向客户端的微服务中验证Auth-Token。

- 我们将Redh实例中的Auth-Token保存为用户信息。

- 面向客户端的服务询问redis实例此标记是否有效

- Redis返回一些JSON字符串,我们可以将其用作用户数据以进一步授权。

所以服务器端流程看起来像这样

get("projects/" / Segment) { projectName =>
  getHeader("Auth-Token") { authToken =>
    Redis.get("auth:token:#{authToken}").map { userJson =>
      if(userJson("projects").include(projectName)) {
        ...processSth...
        Ok
      } else {
        Unauthorized
      }
    }
  }
}

答案 2 :(得分:0)

可以创建单独的Auth服务来提供access_token,就像您在步骤1中所示。但是在API Gateway中,每个服务都需要调用该auth服务来验证令牌。最好在API网关中应用oauth进程,我也在使用我的产品,许多文章也解释了这种方法。让我们看看下面的图片。

inlined image

从技术角度来看,它可能只是代码(函数)的一部分,它处理请求头以验证作为oauth身份验证提供的令牌,可以在代码内处理,也可以在将请求转发给服务之前访问自己的数据库。端点。

您可以使用一种方法通过增强型API网关服务为端点提供身份验证,安全性和请求调度。已经在stackoverflow here上提出了问题,但我发现很容易理解的是3到4个系列的教程,你会发现here

在专注于微服务工作之前,清楚了解您的API网关使用情况。

答案 3 :(得分:0)

根据您构建微服务的方式,您还可以利用构图。

由于您已经拥有身份验证服务,因此您可以在结算服务中使用它来在处理请求之前检查请求的真实性。

例如,如果你使用像StdLib这样的平台(我们在内部使用):

// Billing
const lib = require('lib');

module.exports = function(params, callback) {
  lib.user.isAuthenticated(params, function(err, user) {
    if (err) return callback(err);
    // Do stuff with user, process billing
  });
};

如果你总是使用HTTP在函数之间进行通信,这对你来说可能不是一个好主意(因为这可能会为你的请求增加200-300ms)。但是StdLib在同一区域内加载了一些服务,你可以访问它们,就像解决这个问题的函数一样(至少,到目前为止我们已经看到过)。