当您拥有多人游戏时,您通常需要存储有关您的玩家的信息以供以后的游戏使用、保存游戏统计数据或与您的朋友交流。对于所有这些用例,您通常需要一种唯一标识用户的方法。能够区分用户称为身份验证。有几种方法可用,一些示例包括:
- 询问用户用户名和密码
- 使用第三方 OAuth2 或 OpenID 身份提供商,例如 Facebook、Twitter、Google
- 使用第三方服务,例如 PlayFab、GameLift 或 Steam
- 使用设备ID,移动端非常流行的方法
- 在 Android 中使用 Google Play
- 在 IOS 中使用游戏中心
- 在您的网站中使用网络服务
加密通知
很少有可用的传输支持加密,因此如果您想通过 Mirror 进行身份验证,我们强烈建议您使用支持加密的传输,例如SimpleWebSocket 传输,或使用 UnityWebRequest 与通过 HTTPS 的服务交换敏感数据。这可以在 Authenticator 内部完成,或者在调用 StartClient 之前完成。
持久化数据
NetworkConnection 有一个 Object 类型的 authenticationData 属性,可以在身份验证过程中在服务器和/或客户端上设置几乎任何您需要的东西,例如帐户 ID、令牌、字符选择等,包括数据结构。该数据在 Mirror 中您拥有客户端 NetworkConnection 的其他任何地方都可用……只需将其转换回您放入其中的任何类型。
内置身份验证器
- Basic Authenticator
Mirror 在 Mirror / Authenticators 文件夹中包含一个 Basic Authenticator,它只使用简单的用户名和密码。 - Device Authenticator
在受支持的平台上使用 SystemInfo.deviceUniqueIdentifier,并在 PlayerPrefs 中使用 GUID 作为不支持的平台的后备。
自定义身份验证器
Authenticator 派生自 Authenticator 抽象类,允许您实现所需的任何身份验证方案。
在 Assets 菜单中,单击 Create > Mirror > Network Authenticator 以使用我们的脚本模板制作您自己的自定义 Authenticator,然后根据您的需要填写消息和验证码。当客户端成功通过身份验证时,调用服务器上的 Server.Accept(conn) 和客户端上的 ClientAccept()。 Mirror 正在侦听这些事件以继续连接序列。如果您希望在身份验证后执行其他步骤,请订阅 OnServerAuthenticated 和 OnClientAuthenticated 事件。
消息注册
默认情况下,注册到 NetworkServer 和 NetworkClient 的所有消息都需要身份验证,除非另有明确说明。要注册消息以绕过身份验证,您需要为 RegisterMessage 方法的 bool 参数指定 false:
NetworkServer.RegisterHandler(OnAuthRequestMessage, false);
某些内部消息已设置为绕过身份验证:
- Server
- NetworkPingMessage
- Client
- SceneMessage
- NetworkPongMessage
Tips
- 在 OnStartServer 和 OnStartClient 中注册消息处理程序。它们分别从 StartServer/StartHost 和 StartClient 调用。
- 如果身份验证失败,尤其是在他们可以解决某些问题时,向客户端发送消息。
- 身份验证失败时,在服务器和客户端调用 NetworkConnection 的 Disconnect() 方法。如果您想让用户尝试几次以获得正确的凭据,您当然可以,但 Mirror 不会为您断开连接。
- 如果您发送失败消息,请记住在服务器上的 Disconnect 调用上稍作延迟,以便在连接断开之前有机会传递。至少,产生一帧。
现在您已经有了自定义 Authenticator 组件的基础,剩下的就看您自己了。您可以根据需要在服务器和客户端之间交换任意数量的自定义消息,以在批准客户端之前完成您的身份验证过程。
身份验证也可以扩展到字符选择和自定义,只需在完成身份验证过程之前制作附加消息并与客户端交换它们即可。这意味着此过程发生在客户端玩家实际进入游戏或更改为在线场景之前。
如果您编写了一个好的身份验证器,请考虑与其他用户共享它或将其捐赠给 Mirror 项目。