我正在编写一个API网关,它会将单个入口点暴露给各种其他API,这些API只能通过此API网关访问。
此API网关将提供来自各种前端的请求,例如网站,移动应用,桌面应用,等等......
我希望能够验证对我的API网关的请求来自其中一个来源,而不仅仅是来自执行Curl请求的任何人。为此,我一直在寻找一种授权这些请求的方法。我已经看过实现JWT来验证这些请求来自哪里,这个前端服务必须与API网关共享一个秘密,这样他们就可以创建令牌,然后发送API网关然后验证。我想问题在于这些秘密必须安全地存储在前端应用程序中。
我想知道是否有更好的方法来验证请求是否来自我希望它们来自哪里?
有没有人有任何想法?
提前致谢:)
答案 0 :(得分:0)
正确的方法是实现一个实现OpenId Connect或OAuth2的身份提供程序(单点登录/ SSO)。这些协议具有适用于各种场景的不同身份验证流程,其中包括您所指的一种。您可以将流client_credentials
用于确保client_secret
可以机密的情况,也可以将流implicit
用于无法保持浏览器,javascript应用程序的场景秘密机密。
根据您的应用程序和前端要使用的方案,您应该相应地配置客户端。然后,您的微服务将仅需要以这些协议支持的方式之一验证针对身份提供者收到的令牌。 OpenId Connect在实现上提供了一个“自省端点”,您可以在其中发送令牌,以便身份提供者自行对其进行验证。
请记住,JWT实际上不是一种协议,而是一种格式(一种标准格式,只是一种格式)。在许多身份提供者(IdP)上,您可以选择发出JWT令牌或引用令牌。后者只是一个GUID,不包含任何数据,但可作为令牌生成时内部存储在IdP上的信息的参考。然后,IdP可以将与该参考令牌相关的数据提供给使用该令牌的应用。
答案 1 :(得分:-1)
您可以制作自己的算法,生成唯一的时间相关访问令牌。该算法应该在API网关和前端上实现。
使用JSON Web令牌的好处是JWT是一种流行的身份验证协议。提供了大多数流行编程语言的开源库,因此您无需编写自己的代码。使用标准身份验证库还可以让第三方应用程序更轻松地访问您的API。