通过身份验证访问第三方服务

时间:2014-10-20 13:41:10

标签: rest oauth identity ws-federation bearer-token

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

我正在试图弄清楚哪种方式可以用几件事情,并且想知道你是否有任何关于如何处理某种情况的输入和/或经验

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

  2. 我们还需要进行一些离线处理,这可能会调用需要身份验证的第三方服务,但没有客户端提示。我开始沿着存储SAML令牌和/或用户凭据的路线走下去,但这看起来非常不安全。再次,作为一个IdM伪新手,不太确定如何处理这个(谷歌搜索提出了各种选择,但大多数,如果不是所有看起来都非常不安全)。我想我们可以使用令牌等加密来做一些事情来与它一起存储,然后在运行任务并接收令牌时调用适当的授权服务器。

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

1 个答案:

答案 0 :(得分: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呼叫,你可以迭代该列表,并为每个元素调用&#34; call()&#34;  方法,它将调用正确的第三方API。

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

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

希望这会有所帮助..

干杯