zoukankan      html  css  js  c++  java
  • 【ASP.NET】UCenter实现多站点同步注册

    问题描述

    上一篇文章写了【ASP.Net】UCenter实现多站点同步登录退出
    在整合论坛的时候,同步注册也是相当必要的一个功能:将论坛注册的用户同步到自己的网站,自己网站注册的用户同步到论坛。
    官方提供的API里并没有这个功能,我们只能自己实现。

    问题分析

    根据UCenter同步登录的原理:

    1. 在某个网站登录成功后,向UCenter发出一个同步登录通知
    2. UCenter接收到通知后获取所有app列表,生成一段请求所有开启同步登录app的uc接口传递action=synlogin&time=xxx&uid=xxx等信息的<script></script>字符串
    3. 该网站拿到这一段js后输出到页面,页面就会请求这些app的uc接口
    4. app接收到同步登录的通知,在网站写登录的cookie/session实现同步登录

    接下来,就看看同步登录的具体逻辑

    同步登录分析

    在Discuz! X3.2的class.member.php文件约139行和276行,有这么一段代码

     
    synlogin
     
    synlogin

    意思是判断是否开启了同步登录,是则调用uc_user_synlogin获取同步登录的js并输出到页面

    那我们再来看一下uc_user_synlogin函数,在/uc_client/client.php文件第365行

     
    uc_user_synlogin函数

    调用了一个uc_api_post函数,找一下这个函数,就在当前文件中

     
    uc_api_post函数

    原来是请求了/uc_server/index.php,并传递m=user&a=synlogin
    那我们就再看一下/uc_server/index.php 文件

     
    /uc_server/index.php

    把刚刚的传递的m拼上control,a前面拼上on,即创建了一个usercontrol对象,调用了onsynlogin方法
    而这个usercontrol类就在/uc_server/control/user.php文件中,看31行

     
    onsynlogin函数

    终于找到了这个同步登录的真面目!里面干的事情就是上面所说的,获取全部开启了同步登录的app,然后发出同步登录通知(请求uc接口,传递action=synlogin&username=xxx等参数,通知各个app处理登录)

    处理同步注册

    先从底层开始,依葫芦画瓢。还是在/uc_server/control/user.php文件中,onsynlogin方法的下面
    复制一下上面的onsynlogin方法,把注册必填的username password email参数替换进去,改造成我们需要的onsynregister函数。

     
    onsynregister方法

    接下来,倒回到/uc_client/client.php文件第365行,uc_user_synlogin方法这里,同样复制一下,改造成一个uc_user_synregister方法

     
    uc_user_synregister方法

    最后一步,在/source/class/class_member.php,第923行,论坛注册的地方,加上我们同步注册的代码

     
    同步注册

    到这里,论坛每次有新用户注册之后,UCenter就会向所有应用的站点发出同步请求,这时只需要在应用站点的/API/uc.ashx文件中增加一个注册本站用户的接口功能即可实现站点与论坛同步注册的功能。

    改造DS.Web.UCenter

    1. UcActions.cs文件里面添加一个SynRegister属性
    /// <summary>
    /// 同步注册
    /// </summary>
    public static string SynRegister { get { return "synregister"; } }
    
     
    Paste_Image.png
    1. UcApiBase.cs文件添加同步注册的处理,就加在登录的后面
      首先是抽象方法声明
    /// <summary>
    /// 同步登陆
    /// </summary>
    /// <param name="uid">uid</param>
    /// <returns></returns>
    public abstract ApiReturn SynLogin(int uid);
    /// <summary>
    /// 同步注册
    /// </summary>
    /// <param name="username">用户名</param>
    /// <param name="password">密码</param>
    /// <param name="email">邮箱</param>
    /// <returns></returns>
    public abstract ApiReturn SynRegister(string username, string password, string email);
    

    还有action处理

    else if (Args.Action == UcActions.SynLogin)
    {
        synLogin();
    }
    // 同步注册
    else if (Args.Action == UcActions.SynRegister)
    {
        synRegister();
    }
    

    调用同步注册的地方

    private void synLogin()
    {
        if (!UcConfig.ApiSynLogin) writeForbidden();
        Response.Headers.Add("P3P", "CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"");
        int uid;
        int.TryParse(Args.QueryString["uid"], out uid);
        writeEnd(SynLogin(uid));
    }
    // 同步注册
    private void synRegister()
    {
        string username = Args.QueryString["username"];
        string password = Args.QueryString["password"];
        string email = Args.QueryString["email"];
        writeEnd(SynRegister(username, password, email));
    }
    
    1. 最后在/API/uc.ashx接口中加上自己网站同步注册的逻辑(将用户数据插入数据库等等)
    public override ApiReturn SynRegister(string username, string password, string email)
    {
        return ApiReturn.Success;
    }
    

    OK!大功告成

     


    作者:lancely
    链接:https://www.jianshu.com/p/1caa425ef24b
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    DevExpress 最最最基础踩坑(如何设置控件属性)
    Oracle如何创建数据库(使用图形化界面,顺便提一下UTF-8和ZB16GB字符集的问题)
    ElementUI el-dialog中嵌套子页面
    Oracle详细教程(触发器,事务,存储过程,锁,游标)
    和人事交谈下来的几点感悟
    Oracle Groupby分组缺少表达式解决方法
    leetcode973. 最接近原点的 K 个点(谈谈C#中的Icomparer,ComParer,IComparable)
    APP的闪退和无响应
    APP测试的主要内容
    python数据结构
  • 原文地址:https://www.cnblogs.com/webenh/p/8092597.html
Copyright © 2011-2022 走看看