【Unity】 HTFramework框架(三十二)授权验证

更新日期:2020年3月2日。
Github源码:[点我获取源码]
Gitee源码:[点我获取源码]

授权验证简介

授权验证功能支持在你的游戏启动时,执行指定的授权检查,可以是本地授权检查,也可以是远程授权检查,只有授权检查通过才能正常进入游戏,如果授权检查失败,框架将会瘫痪整个程序,无论用户做出任何补救措施都将是徒劳(介于没有登录服务器的情况下)。

使用授权验证

取消永久授权

要使用授权验证功能,必须取消框架默认的永久授权条件。

Main模块的属性面板,打开License选项卡,取消勾选Permanent License(勾选此选项为永久授权)。
在这里插入图片描述

建立授权者

我们新建一个授权者MyLicenser(授权者类必须继承至LicenserBase):

public class MyLicenser : LicenserBase
{
    public override string LicenseFailurePrompt
    {
        get
        {
            return "授权验证失败,请退出游戏,进入官网重新下载游戏!";
        }
    }

    public override IEnumerator Checking()
    {
        throw new System.NotImplementedException();
    }
}

通过本地时间授权

如果想做的简单一点,直接通过本地时间授权,比如让用户每次下载游戏只能玩两个月,两个月之后必须进入官网重新下载(当然是针对单机游戏),我们如下修改:

public class MyLicenser : LicenserBase
{
    //用户下载游戏(也即是第一次进入游戏)的时间
    private DateTime _loadTime;

    public override string LicenseFailurePrompt
    {
        get
        {
            return "授权验证失败,请退出游戏,进入官网重新下载游戏!";
        }
    }

    /// <summary>
    /// 授权验证
    /// </summary>
    public override IEnumerator Checking()
    {
        //获取下载时间
        _loadTime = Main.m_CustomModule["Loader"].GetLoadTime();

        yield return null;

        int days = new TimeSpan(DateTime.Now.Ticks - _loadTime.Ticks).Days;
        
        //使用天数小于等于60天,才授权通过
        IsLicensePass = days <= 60;
    }
}

通过远程时间授权

本地时间授权有一个致命的BUG,用户可以随意修改自己的系统时间,导致授权失误!所以在拥有服务器的情况下,我们可以进一步建立远程时间授权机制,我们如下修改:

public class MyLicenser : LicenserBase
{
    public override string LicenseFailurePrompt
    {
        get
        {
            return "授权验证失败,请退出游戏,进入官网重新下载游戏!";
        }
    }

    /// <summary>
    /// 授权验证
    /// </summary>
    public override IEnumerator Checking()
    {
        //获取下载时间
        DateTime loadTime = Main.m_CustomModule["Loader"].GetLoadTime();

        //向服务器发起授权验证请求(传入下载时间,不传当前时间,当前时间由服务器获取)
        yield return Main.m_CustomModule["Licenser"].BeginLicense(loadTime);
        
        //等待获取验证状态
        IsLicensePass = Main.m_CustomModule["Licenser"].IsLicensePass;
    }
}

通过本地授权码授权

我们也可以通过让用户输入授权码的形式来授权,我们如下修改:

public class MyLicenser : LicenserBase
{
    public override string LicenseFailurePrompt
    {
        get
        {
            return "授权验证失败,授权码错误,请重新进入游戏!";
        }
    }

    /// <summary>
    /// 授权验证
    /// </summary>
    public override IEnumerator Checking()
    {
        //打开授权码输入界面
        yield return Main.m_UI.OpenTemporaryUI<LicenserPanel>();

        LicenserPanel licenserPanel = Main.m_UI.GetOpenedUI<LicenserPanel>();

        //等待用户输入授权码完成
        yield return licenserPanel.WaitInputDone();

        //授权码仓库中存在当前输入的授权码,则授权通过
        if (Main.m_CustomModule["LicenseCodeHouse"].IsExist(licenserPanel.LicenseCode))
        {
            IsLicensePass = true;
        }
        else
        {
            IsLicensePass = false;
        }
    }
}

通过远程授权码授权

同样的问题,本地授权码形式也可以进阶为远程授权,这样可以让我们的游戏安全系数更高,即使用户输入的授权码正确,你也可以通过同一个IP只能绑定同一个授权码的喷血设定防止用户到处传播一个授权码,我们如下修改:

public class MyLicenser : LicenserBase
{
    public override string LicenseFailurePrompt
    {
        get
        {
            return "授权验证失败,授权码错误,请重新进入游戏!";
        }
    }

    /// <summary>
    /// 授权验证
    /// </summary>
    public override IEnumerator Checking()
    {
        //打开授权码输入界面
        yield return Main.m_UI.OpenTemporaryUI<LicenserPanel>();

        LicenserPanel licenserPanel = Main.m_UI.GetOpenedUI<LicenserPanel>();

        //等待用户输入授权码完成
        yield return licenserPanel.WaitInputDone();

        //向服务器发起授权验证请求
        yield return Main.m_CustomModule["Licenser"].BeginLicense(licenserPanel.LicenseCode);

        //等待获取验证状态
        IsLicensePass = Main.m_CustomModule["Licenser"].IsLicensePass;
    }
}

使用授权者

如上所述的只是几种授权方式的例子,你可以自定义任何授权方式,不过必须得在Main模块属性面板的License选项卡下启用该授权者,指定的授权者才能正式启用。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神码编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值