BNEI啊,玩家不是傻子
《机动战士高达EXVS 武装力量》(下文简称EXVSF)发售了,发售前获得了FAMI通31分的评分,然而却在发售日获得了一边倒的恶评,PS Store内本作的评价功能甚至一度被关闭。即便如此也挡不住玩家的愤怒,截止本文写作时日本亚马逊上本作的评分有85%是一星。
就这样BNEI又一次陷入激烈的舆论漩涡中。仔细回想一下,这两年来这样的事件似乎已经开始变得有些常见,从前年的《JOJO的奇妙冒险 全明星大乱斗》(下文简称JOJOASB)的发售前万众期待和FAMI通满分神作到发售后的迅速值崩,到今年年初发售的《情热传说》(下文简称TOZ)被女主角虚假宣传的批评所笼罩。不同的游戏,不同的问题,但是到最后剧情总会发展到同样的以BNEI的尴尬来收场。和这样的事件相比,笔者这种《高达VS》系列的玩家在去年EXVSFB发售时的抱怨简直微不足道。
当国内玩不到街机的《高达VS》系列的玩家都觉得已经玩够了EXVSFB苦苦等着EXVSMB移植家用机的时候,BNEI突然宣布了掌机上的新作。EXVSF在宣传上向玩家承诺了有新系统,也会有新参战机体,当时肯定不会有人想到这个游戏在发售之后会变成这个样子。
可怜的机体数量
如果问起高达游戏对于玩家的最大吸引力,相信有很大一部分人会回答会是这样:高达作品中出现的各种极富个性的机体和它们的驾驶员。
EXVSF中可用的机体数量为43台(40台基本自带加上3台特典赠送),而这3台特典机中还有2台只有小部分机体细节和驾驶员立绘不同。
再比较一下系列的其他作品:PSP版《机动战士高达 高达VS高达 NEXT PLUS》(GVGNP)一共有66台可用机体,去年发售的PS3游戏《机动战士高达EXVS 火力全开》(以下EXVSFB)有96台初始可用机体,算上DLC超过了100台。EXVSF的确像宣传中所说的那样有新参战机体,与之相对的就是有大量的机体从游戏中被删除。
这张玩家制作的图片中虽然还存在一些谬误,却真实的表现出游戏的情况
单机模式?
再将视线投向游戏的玩法。本次EXVSF声称更为注重单人游戏,却把街机模式和自由对战模式都移除了,只留下一个任务模式。
去年的EXVSFB的任务模式因为其基本就是照搬前作《机动战士高达EXVS》的任务而广受诟病,购买了EXVSF的玩家却只能发现这次作为游戏重中之重的任务模式还不如EXVSFB。
此外,本作无法自由设置键位,游戏仅为玩家提供了三种可选键位,每一种都与系列本身的默认键位有所不同,极大的影响了老玩家的游戏体验。不仅如此,游戏还取消了觉醒系统,很多机体简化了武装,这些都不是受人待见的改动。
本作的标题菜单,可以看到游戏模式只有任务(EXTREME FORCE)和1对1面连(FORCE BATTLE)两种
灵魂缺失
如果说在PSP上的《联合VS扎夫特 Plus》之前所有的移植版作品都没有4人对战模式受到了机能和网络条件的限制,那么这次的EXVSF则令人难以理解。本次的EXVSF居然没有网络联机功能,而近距离面连也只能1对1。
这对于挂着这样一个标题的系列新作来说无异于自我摧毁,它只有作为一款系列作品的形,但却缺失了最重要的神。笔者很难认同这样一款游戏是这一系列的新作,相信很多老玩家也是。而BNEI希望这款PSV游戏能带动没有接触过系列的新玩家了解游戏,进而扩大街机版的用户群体,则更近乎于天方夜谭。
其实不难看出BNEI将这款游戏如此设置的意图所在,一大批的付费DLC和之后不断的加强版游戏肯定早已就在日程表上。虽说EXVSFB接连发售强力机体DLC,推出大量小型改动的“马甲机”DLC,以及游戏的最强机体是DLC机体等都受到了不少批评,但也在玩家群的理解和接受范围之内。
但是如此的大量减少登场机体数量就为了骗玩家几次钱,恐怕BNEI真的是认为玩家愿意无条件为这个系列的掌机新作掏钱。然而初始版都恶评如潮,还如何号召玩家来购买DLC和加强版的新作游戏呢?
API 网关 OpenID Connect 实战:单点登录(SSO)如此简单
作者:戴靖泽,阿里云 API 网关研发,Higress 开源社区 Member
随着企业的发展,所使用的系统数量逐渐增多,用户在使用不同系统时需要频繁登录,导致用户体验较差。单点登录(Single Sign-On,简称 SSO)正是为了解决这一问题。当用户登录一次后,即可获取所有系统的访问权限,不需要对每个单一系统逐一登录。
目前,SSO 的实现方案常见有以下几种:
- 基于 JWT:JWT(JSON Web Token)是一种用于在各方之间安全传递信息的开放标准,令牌中包含用户的身份信息和权限。然而,JWT 用于 SSO 时缺乏标准化方案,导致集成复杂,且令牌一旦签发无法撤销,可能影响安全性。
- 基于 CAS:CAS(Central Authentication Service)是一种基于中间件的开源单点登录解决方案,通常用于大学和大型企业。用户在一处登录后即可无缝访问所有与 CAS 集成的应用。但其实现较为复杂,对系统集成要求较高。
- 基于 SAML:SAML(Security Assertion Markup Language)是一种协议,用于在应用程序与 SSO 服务之间交换身份验证信息。它使用 XML 来交换用户标识数据,提供高安全性和灵活性,但配置和实施较为复杂,增加了开发和维护成本。
- 基于 OIDC:OIDC(OpenID Connect)是基于 OAuth 2.0 的身份验证层,允许用户通过多种客户端(如 Web 应用、移动应用等)进行身份验证。OIDC 具有标准化、简单易用、灵活性和安全性等优点,成为许多企业在实现单点登录时的首选。
OIDC 还有广泛第三方服务提供商的支持,如支付宝、钉钉、微信、GitHub 等。例如下图中 Sealos 应用的登录页面,可以跳转 Github,微信和 Google 进行第三方登录,使用的就是 OIDC 身份认证:
Higress 网关作为后端服务所有请求的入口,可以集成 OIDC 实现统一认证服务,所有后端服务不需要各自实现用户认证逻辑,而是统一通过网关进行用户身份的验证。这样简化了系统架构,减少了重复工作,并提高了安全性。
用户在网关配置 OIDC 认证鉴权,可以实现对资源的细粒度访问控制。并且可以方便地对接自建的身份认证服务,或者社交媒体账号等其他第三方账户登录,增强了业务的便利性。
基于此,我们实现了 OIDC 插件让用户在 Higress 网关可以零代码实现 SSO 单点登录。
后端样例服务部署
参考 Istio Bookinfo[1]样例在集群中部署后端样例服务,用来调试 OIDC 插件功能,部署好之后可以通过下面的命令验证是否部署成功。
通过自建身份服务使用 OIDC 插件
配置示例
部署 keycloak 身份认证服务
参考 keycloak-getting-started-docker[2]使用 docker 快速部署 keycloak 身份认证服务,添加用户并创建 client。
注:需填写 Valid redirect URIs,Valid post logout URIs,Web origins 配置项,否则 OIDC Provider 会认为用户跳转的重定向 URL 或登出 URL 无效。
Higress 服务配置
在 Higress 服务来源中创建 Keycloak 固定地址服务。
Wasm 插件配置
插件效果演示
访问服务页面,未登陆的话进行跳转。
登陆成功跳转到服务页面。
访问登出跳转到登出页面。
访问登出跳转到登出页面(携带 post_logout_redirect_uri 参数跳转指定 uri)。
通过第三方服务提供商使用 OIDC 插件
配置示例
配置阿里云 OAuth 应用
参考 Web 应用登录阿里云[3]流程配置 OAuth 应用。
Higress 服务配置
为了让插件能够访问到 OIDC 服务提供商,需要在 Higress 服务来源中创建 Aliyun DNS 服务。
插件参数配置
插件效果演示
访问服务页面,未登陆的话进行跳转。
扫码登陆成功跳转到服务页面。
访问登出跳转到登出页面(阿里云登出后会重定向到登录页)。
Istio Sidecar 容器方案
Istio 社区提出了使用 Sidecar 容器部署外部授权[4],例如 Istio OIDC Authentication with OAuth2-Proxy[5]中提到的部署成熟的 oauth2-proxy 方案,但是这种方案的缺陷首先是在外部授权服务与数据面之间会多一层请求调用,导致性能上会差,其次是外部授权服务会占用一定的 CPU 资源和内存资源,并且如果用户的需要配置多个服务提供商,这个方案也需要部署多个外部授权,因此这个方案灵活性不够强。
Envoy Filter 方案
现有 Envoy 社区开发的 C++ 原生的 OAuth2 Filter[6]也可以实现 OIDC 身份认证的功能,目前社区正在积极开发中,Envoy 社区的 envoy gateway[7]项目使用了该方案,现有的问题是不支持 OIDC 协议标准的 state 参数(Issue 35232[8])导致受 CSRF 攻击威胁,并且不支持对 cookie 中的令牌进行加密(Issue 23508[9]),因此这个方案存在安全漏洞导致 OAuth2 Filter 无法在生产环境中使用。
Wasm 插件方案
开源的 Higress 项目插件开发框架[10]提供了多种编程语言包括 Rust,C++,Golang 和 AssemblyScript(TypeScript 的 Wasm 方言)等编写 Wasm 插件,相比于 C++ 的生态,Rust,Go,TypeScript 等语言的开源库生态更丰富,其中开源的实现了 OIDC 功能的项目如下:
- Golang:oauth2-proxy[11]
- Rust:oauth2-rs[12]
- TypeScript:angular-oauth2-oidc[13]
其中 oauth2-proxy 项目在开源社区中得到了广泛的使用和验证,同时拥有最活跃的社区支持,发布频繁的更新和改进,实现了大部分常见的 OIDC 服务提供商,也是目前 Istio Sidecar 容器方案中推荐的。Wasm 插件方案的优势体现在以下三个方面:
- 生产可用性:OIDC 协议涉及身份认证,稳定性和安全性至关重要。基于成熟的开源项目二次开发的插件,通常具有更高的可靠性
- 可扩展性:不同企业实现 OIDC 协议时不一定会完全遵循标准,企业用户可以基于开源的插件代码进行二次开发,实现企业定制化的需求。
- 安全性:插件运行在严格的沙箱虚拟环境中,即使代码出现异常也不会使得 Envoy 崩溃。
因此基于以上优势并考虑到前两个方案的灵活性不够强和安全漏洞问题,选择开发 Wasm 插件实现 OIDC 功能。
OIDC 插件基于 oauth2-proxy 项目的核心流程实现,由于在 Envoy 插件中发起外部请求需要通过异步调用,因此将 oauth2-proxy 项目的主流程中的同步调用改为跟 Envoy 中外部服务的异步调用,在回调函数中对响应进行处理,具体的代码参考 Higress 中的 OIDC 插件[14],OIDC 插件的请求响应流程如图所示。
1. 模拟用户访问对应服务 api。
2. Higress 重定向到 OIDC Provider 登录页同时携带 client_id、response_type、scope 等 OIDC 认证的参数并设置 csrf cookie 防御 CSRF 攻击。
3. 用户在登录页进行登录。
4. 携带授权重定向到 Higress 并携带了 state 参数用于验证 CSRF Cookie,授权 code 用于交换 Token。
5. 利用授权交换 id_token 和 access_token。
返回的请求里包含了 id_token,access_token,refresh_token 用于后续刷新 access_token。
6. 将获得的 id_token 和 access_token 加密存储在 Cookie _oauth2_proxy 中,用于后续用户登录状态的验证,同时清除 Cookie _oauth2_proxy_csrf。
7. 携带 Authorization 的标头对应 access_token 访问对应 api。
8. 后端服务根据 access_token 获取用户信息并返回对应的 Http 响应。
本文对 Higress 中开源的 OIDC Wasm 插件进行了介绍,现在 Higress 项目中 Wasm 插件支持使用 Go、C++、Rust、AssemblyScript 等语言编写,后续会支持更多的编程语言,有着更低的开发门槛,同时 Wasm 插件运行在隔离的沙箱环境中,具有更高的安全性,而 Wasm 本身作为一种高性能的可移植二进制指令格式不断的有新的进展和技术革新,未来网关场景的更多功能均可以考虑在 Wasm 插件中实现。
本文中的 OIDC Wasm 插件已在 Higress 项目中开源:https://github.com/alibaba/higress/tree/main/plugins/wasm-go/extensions/oidc
欢迎大家在 github 社区提出宝贵的建议,或者在 Higress 社区交流群(钉钉群号:30735012403)里一起沟通。
相关链接:
[1] Istio Bookinfo
https://istio.io/latest/docs/examples/bookinfo/
[2] keycloak-getting-started-docker
https://www.keycloak.org/getting-started/getting-started-docker
[3] Web 应用登录阿里云
https://help.aliyun.com/zh/ram/user-guide/access-alibaba-cloud-apis-from-a-web-application
[4] 外部授权
https://istio.io/latest/zh/docs/tasks/security/authorization/authz-custom/
[5] Istio OIDC Authentication with OAuth2-Proxy
https://medium.com/@lucario/istio-external-oidc-authentication-with-oauth2-proxy-5de7cd00ef04
[6] OAuth2 Filter
https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/oauth2_filter
[7] envoy gateway
https://github.com/envoyproxy/gateway
[8] Issue 35232
https://github.com/envoyproxy/envoy/issues/35232
[9] Issue 23508
https://github.com/envoyproxy/envoy/issues/23508
[10] 开发框架
https://github.com/alibaba/higress/tree/main/plugins
[11] oauth2-proxy
https://github.com/oauth2-proxy/oauth2-proxy
[12] oauth2-rs
https://github.com/ramosbugs/oauth2-rs
[13] angular-oauth2-oidc
https://github.com/manfredsteyer/angular-oauth2-oidc
[14] OIDC 插件
https://github.com/alibaba/higress/tree/main/plugins/wasm-go/extensions/oidc
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。