0

我有一个调用外部(第 3 方)服务的应用程序,我想知道是否可以得到一些帮助。

我试图弄清楚如何处理几件事,并想知道您是否对如何处理某些情况有任何意见和/或经验

  1. 我们希望能够创建一个服务处理第三方调用的架构,这样客户端就不需要知道它正在访问哪个服务。例如,如果我们有一种方法可以与像 DocuSign 这样的第三方集成以进行文档签名,那么客户端应该能够在我们端调用一个服务来确定(基于一些凭据、租约等)它与哪个服务集成. 然而,我开始创建一个接口,它仍然让客户端确定要实例化和调用的实现,如果可能的话,我们想尝试分离它。一个。调用我们的“文档签名”服务,并带有我们正在使用的客户端和租户的一些指示,可能是通过访问令牌。湾。然后,该文档签名服务将需要指出它需要什么样的凭据,并让客户端知道如何登录该服务。例如,它可能希望重定向到授权服务器以获取访问令牌以发送到我们的服务以进行调用。

  2. 我们还需要完成一些离线处理,这可能会调用需要身份验证的 3rd 方服务,但没有需要提示的客户端。我开始沿着存储 SAML 令牌和/或用户凭据的路线前进,但这似乎非常不安全。同样,作为一个 IdM 伪新手,不太确定如何处理这个问题(谷歌搜索带来了各种选项,但大多数(如果不是全部的话)看起来非常不安全)。我想我们可以对令牌等进行加密,以便与它一起存储,然后在运行任务并接收令牌时调用适当的授权服务器。

有关如何正确处理这些问题的任何意见?

4

1 回答 1

0

好的,首先你需要考虑你正在使用第三方 API 调用来做你需要做的任何事情,所以你需要记住的第一件事是你肯定需要访问令牌让你的用户访问这些 API .

因此,如果您说您可以为一个用户提供各种第三方 API,您可能想要做的是创建一个抽象类,该类具有 CALL() 方法,该方法将被具体类覆盖(每个第三方一个API),例如:

public abstract class ApiData {

//Your variables

protected call(String url, //Some parameters) {
//default body
}

在此之后,您可以创建一个将覆盖 ApiData 类的类。例如:

public class DocuSignApi extends ApiData {

//Your variables

@Override
private call(String url, //Some parameters) {
// APi call for DOCUSIGN
}

这样,每当您在系统中创建用户时,您都需要为他保存一个 ApiData 列表,例如:

public class MyUser {
// All parameters

private List<ApiData> apiCalls = new ArrayList<ApiData>();

}

有了这个,您将拥有每个用户,他可以访问的所有 Api 调用,您可以迭代该列表并为每个元素调用“call()”方法,它将调用正确的第三方 API。

现在,对于您的第三方 API 登录,它取决于每个 API。可能,您可能希望为每个 API 使用一个相同的凭证并将其用于您的每个客户端(他们将无法访问该凭证,您可能在您的数据库或代码中的某个位置加密了这个凭证,如属性文件)。如果每个客户端在每个 API 中都有不同的凭据,那么您还需要在每个 API 上记录他并将第三方访问令牌保存在其他地方(数据库),并允许他使用该令牌直到它过期。

我还猜测您已经为您的用户实现了自己的登录服务。我不确定你是否在问什么是最好和最安全的方法,但如果是这种情况,我会给你一个例子。我在我做过的一些项目中有很多登录,我使用的是 OAUTH 登录。基本上,您所做的是通过 HTTP 标头请求您的凭据加密,然后如果登录数据正确,您可以通过检查数据库来让用户登录或不登录。如果登录成功,您将创建一个访问令牌,将该访问令牌保存在您的数据库中(带有创建日期),并将其返回给您的用户,这样您还可以拥有使令牌过期的功能,这是一个非常好的做法.

希望这可以帮助..

干杯

于 2014-10-20T15:49:12.363 回答