Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 有没有办法在微服务前实现SSO?_Go_Single Sign On_Cas_Microservices_Beego - Fatal编程技术网

Go 有没有办法在微服务前实现SSO?

Go 有没有办法在微服务前实现SSO?,go,single-sign-on,cas,microservices,beego,Go,Single Sign On,Cas,Microservices,Beego,最近,我有一个项目要基于实现多个web应用程序。最流行的SSO项目是,它需要在中心有一个CAS服务器,在每个web应用程序之前有一个CAS客户端。不幸的是,似乎没有任何官方的CAS客户端是用Golang编写的,除了,和,它支持Beego 但CAS的工作流程有点复杂:重定向太多,在CAS、web应用程序和用户浏览器之间传输的票证太多。我不明白为什么人们将身份验证服务部署在所有web应用程序的中心,而不是前端,如下图所示: 在此图中,所有请求都必须首先在身份验证服务中处理,如果身份验证成功,则生成

最近,我有一个项目要基于实现多个web应用程序。最流行的SSO项目是,它需要在中心有一个CAS服务器,在每个web应用程序之前有一个CAS客户端。不幸的是,似乎没有任何官方的CAS客户端是用Golang编写的,除了,和,它支持Beego

但CAS的工作流程有点复杂:重定向太多,在CAS、web应用程序和用户浏览器之间传输的票证太多。我不明白为什么人们将身份验证服务部署在所有web应用程序的中心,而不是前端,如下图所示:

在此图中,所有请求都必须首先在身份验证服务中处理,如果身份验证成功,则生成一个会话ID,保存在Cookie和Redis中,由其他微服务共享。根本没有任何重定向或票证,只有请求传输

那么这个图是可能的,还是我忽略了一些关键问题

更新0 会话共享方式确实不像顾问那样具有可扩展性和模块化。如何在auth服务和下游服务之间的请求头中传输用户信息,如姓名、电子邮件等,如Heipei at的创造性工作?有没有可能像Sam Newman在书中分享的那样将其作为SSO网关使用

更新1 下面是一个更详细的图表,为了更清楚地描述我孩子气的想法,希望海培和山姆·纽曼不会有太多误解

与处理如此多的重定向和握手不同,所有请求首先在身份验证服务中处理,该服务将来自MySQL的用户信息写入Redis作为会话提供程序,如果请求成功通过身份验证,则HTTP头将传输到下游服务

通过这种方式,用户信息通过HTTP报头传输,而不是作为警告的上述共享Redis,并且Redis可以与auth服务一起解析,或者仅在auth实例之间共享

更新2 看来Cookie和Session都是老派技术。cookie的跨域问题和会话的共享问题是现代web应用程序可扩展性和灵活性的主要障碍。幸运的是,JSON Web Token通过将用户信息(也许id足够)存储从服务器端移动到客户端,并仅在必要时传输,成为目前多个轻量级服务的最佳单点登录解决方案

但CAS的工作流程有点复杂:重定向太多,在CAS、web应用程序和用户浏览器之间传输的票证太多。我不明白为什么人们在所有web应用程序的中心部署身份验证服务,而不是在前端,如下图所示

您的想法是老式的,这就是为什么架构师在过去提出了一些解决方案,比如为Web应用程序使用portlet服务器、会话共享集群,以及许多其他容易出错的系统解决方案,这些解决方案消耗了您的cpu、内存或bandwith,直到第一次实际测试之前,您永远无法预测


CAS解决方案乍一看可能很复杂,但您可以预测您的系统将生成多少登录、流量和同步数据。与“旧解决方案”相比,您的系统对用户负载将呈线性增长,而不是指数增长

在体系结构上,最好不要让A和B仅仅为了获得会话cookie而依赖Redis持久性。只有“身份验证服务”应连接到Redis。A和B应该通过身份验证服务(通过HTTP API或其他方式)获取会话信息。@Nadh感谢您的回复。为了共享用户信息会话,所有服务只有一个会话,每个服务都使用前缀“appname.sessionname”为密钥设置值。如果A和B与身份验证服务通信,它的工作原理与CAS完全相同。你是说CAS模式是唯一的选择吗?还有其他解决方案吗?根据定义,CAS是“中心的”。您的方法在短期内也有效,但它不是非常模块化或可扩展。如果A和B移动到不同的数据中心怎么办?在互联网上建立Redis连接将是一件痛苦的事情。此外,您创建的每项服务(无论使用何种语言)都必须具有Redis驱动程序和连接性。查看本文,了解各种实现的概述--@Nadh非常感谢!你的观点正是我遗漏的。CAS确实是一种灵活的会话共享方式。我最初的动机是简化请求处理的工作流,即API网关模式,它使用
auth_request
mod通过Nginx服务器传输请求。一个愚蠢的问题,为什么连接到远程Redis服务器很痛苦?
redis cli-h主机
是否工作正常,或者是否存在复杂的安全问题?通过internet公开您的redis服务器,只是为了共享会话,会引起安全问题。然后,您必须有强大的防火墙和安全措施,增加另一个故障点。一个简单的HTTP API将消除这些问题和复杂性。感谢您的回复!你在建筑上太过时了!“会话共享集群”确实要花费很多内存,因为有很多会话没有被破坏,而且大多数用户不需要手动注销。我刚开始学习微服务,是“API网关”模式,类似于“portlet服务器”?对不起,Yang,我对Kong一无所知。我也不太了解。源代码是去年打开的。我只是从开始,所以我想知道以这种方式实现SSO的可能性。