单点登录 - 应用端实现

实现中又删节了几个接口

<?php
/**
 * 自有用户中心,应用端接口类
 * Enter description here ...
 * @author blue
 *
 */
class MyCenter{
    //应用Key,唯一表明应用的身份
    private $key='<保密>';

    //用户密钥,不在网络上传输
    private $secret='<保密>';

    //自有用户中心接口地址
    private $apiUrl='<保密>';

    /**
     * 构造一个错误消息
        错误编码    错误消息
        1    用户名(Name)不允许特殊字符
        2    用户名(Name)已经被使用
        3    用户不存在
        4    用户名(Name)不匹配
        5    密码(Password)错误
        6    禁止登录
        7    附加信息(Key)已经存在
        8    附加信息(Key)不存在
        9    其它错误
     * @param unknown_type $code
     * @param unknown_type $message
     */
    private function error($code,$message){
        return array('ErrorCode'=>$code,'ErrorMessage'=>$message);
    }

    /**
     * 注册,同步方式
     * 在自有用户中心注册一个新用户,如果成功,返回一个新的用户编号
     * 此操作不修改此用户的登录状态
     * 要修改用户的登录状态,请使用setLogin方法
     * @param unknown_type $name    用户名(多应用间唯一)
     * @param unknown_type $password 密码(MD5)
     * @param unknown_type $others 其它附加信息
     */
    public function register($name,$password,$others=array()){
        //用户名不能为空
        if(!$name){
            return $this->error(9, '缺少必要的参数:Name');
        }

        //用户名必须是字符串
        if(!is_string($name)){
            return $this->error(9, '参数数据类型错误:Name');
        }

        //用户名只允许汉字,字母,数字以及下划线
        if(!preg_match('/[\w'.chr(0xa1).'-'.chr(0xff).']+/')){
            return $this->error(1, '用户名中不允许包含特殊字符.');
        }

        //构造全部参数数组
        $params=array_merge($others,array('name'=>$name,'password'=>md5($password)));

        //调用通用接口
        return $this->sync('Register', $params);
    }

    /**
     * 登录,同步
     * 自有用户中心此用户是否允许登录,如果成功,返回此用户唯一编号
     * 此操作不修改此用户的登录状态
     * 要修改用户的登录状态,请使用setLogin方法
     * @param unknown_type $name 用户名
     * @param unknown_type $password 密码
     */
    public function login($name,$password){
        //用户名不能为空
        if(!$name){
            return $this->error(9, '缺少必要的参数:Name');
        }

        //用户名必须是字符串
        if(!is_string($name)){
            return $this->error(9, '参数数据类型错误:Name');
        }

        //密码不能为空
        if(!$password){
            return $this->error(9, '缺少必要的参数:Password');
        }

        return $this->sync('Login', array('name'=>$name,'password'=>md5($password)));
    }

    /**
     * 修改密码,同步
     * 通知自有用户中心修改指定用户的密码,不返回数据
     * @param unknown_type $id  用户编号
     * @param unknown_type $old  原有密码
     * @param unknown_type $new 新密码
     */
    public function changePassword($id,$old,$new){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }

        //原密码不能为空
        if(!$old){
            return $this->error(9,'缺少必要的参数:Old Password');
        }

        //新密码不能为空
        if(!$new){
            return $this->error(9, '缺少必要的参数:New Password');
        }

        return $this->sync('ChangePassword',array('id'=>$id,'password'=>$old,'new'=>$new));
    }

    /**
     * 修改用户名称,同步
     * 通知自有用户中心修改指定用户的名称,不返回数据
     * @param unknown_type $id 用户编号
     * @param unknown_type $name 新用户名
     */
    public function rename($id,$name){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }

        //用户名不能为空
        if(!$name){
            return $this->error(9, '缺少必要的参数:Name');
        }

        //用户名必须是字符串
        if(!is_string($name)){
            return $this->error(9, '参数数据类型错误:Name');
        }

        //用户名只允许汉字,字母,数字以及下划线
        if(!preg_match('/[\w'.chr(0xa1).'-'.chr(0xff).']+/',$name)){
            return $this->error(1, '用户名中不允许包含特殊字符.');
        }

        return $this->sync('Rename',array('id'=>$id,'name'=>$name));
    }

    /**
     * 增加附加信息
     * 在自有用户中心为指定用户保存一条附加信息
     * 增加与修改合并到同一个接口中
     * @param unknown_type $id 用户编号
     * @param unknown_type $key 附加信息的键(只允许字母数字汉字下划线)
     * @param unknown_type $value 附加信息的值 串/文件超链接
     * @param unknown_type $type 类型:Text/File
     */
    public function insert($id,$key,$value,$type='Text'){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }

        //附加信息的键不能为空
        if(!$key){
            return $this->error(9,'缺少必要的参数:Key');
        }

        //键只允许汉字,字母,数字以及下划线
        if(!preg_match('/[\w'.chr(0xa1).'-'.chr(0xff).']+/',$key)){
            return $this->error(1, '附加信息的键不允许包含特殊字符.');
        }

        //类型只允许Text/File
        if($type!=='Text' and $type!=='File'){
            return $this->error(9, '附加信息类型错误:Type');
        }

        return $this->sync('Insert',array('id'=>$id,'key'=>$key,'value'=>$value,'type'=>$type));
    }

    /**
     * 删除指定用户的指定附加信息
     * @param unknown_type $id 用户编号
     * @param unknown_type $key 附加信息的Key
     */
    public function delete($id,$key){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }

        //附加信息的键不能为空
        if(!$key){
            return $this->error(9,'缺少必要的参数:Key');
        }

        //键只允许汉字,字母,数字以及下划线
        if(!preg_match('/[\w'.chr(0xa1).'-'.chr(0xff).']+/',$key)){
            return $this->error(1, '附加信息的键不允许包含特殊字符.');
        }

        return $this->sync('Delete',array('id'=>$id,'key'=>$key));
    }

    /**
     * 查询一条附加信息的值
     * @param unknown_type $id 用户编号
     * @param unknown_type $key 附加信息的Key
     */
    public function select($id,$key){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }

        //附加信息的键不能为空
        if(!$key){
            return $this->error(9,'缺少必要的参数:Key');
        }

        //键只允许汉字,字母,数字以及下划线
        if(!preg_match('/[\w'.chr(0xa1).'-'.chr(0xff).']+/',$key)){
            return $this->error(1, '附加信息的键不允许包含特殊字符.');
        }

        return $this->sync('Select',array('id'=>$id,'key'=>$key));
    }

    /**
     * 获取联合登录区域代码,同步
     * 调用此段代码前,应用需要在SESSION中自行保存跳转地址(用户想要去的页面,如商品详细页)
     * @param unknown_type $redirect 回调地址
     * 这个地址是用来处理后继事情的,包括同步登录状态,跳转到用户想要去的页面
     */
    public function unionShow($redirect){
        if(!$redirect){
            return $this->error(1, '缺少必要的参数:Redirect');
        }

        return $this->sync('UnionShow',array('redirect'=>$redirect));
    }

    /**
     * 获取联合登录方的信息
     * @param unknown_type $id 用户编号
     * @return array:
     Array(
     array('<合作方>','<合作方编号>'),
     ...
     )
     */
    public function unionGet($id){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }
        return $this->sync('UnionGet',array('id'=>$id));
    }

    /**
     * 更新自有用户中心的登录状态,异步方式
     * 登录状态在应用和自有用户中心 双方 同时 保存
     * @param unknown_type $id 用户编号 如为0表示 取消当前用户的登录状态
     * @param unknown_type $redirect 完成后的回调地址
     */
    public function setLogin($id,$redirect){
        //用户编号不能为空
        if(!$id){
            return $this->error(9, '缺少必要的参数:Id');
        }

        if(!$redirect){
            return $this->error(1, '缺少必要的参数:Redirect');
        }

        $this->async('SetLogin', $redirect,array('id'=>$id));
    }

    /**
     * 获取自有用户中心的登录状态,异步方式
     * @param unknown_type $redirect 回调地址
     * 回调后,会有一个参数id 表示用户编号
     */
    public function getLogin($redirect){
        if(!$redirect){
            return $this->error(1, '缺少必要的参数:Redirect');
        }

        $this->async('GetLogin', $redirect);
    }

    /**
     * 处理同步请求
     * 应用在调用同步请求后等待返回值,继续后继处理
     * @param unknown_type $action 接口名称
     * @param unknown_type $params 接口参数
     * @return 自有用户中心 返回的数据
     */
    private function sync($action,$params){
        $uniqId=uniqid();

        $ret=file_get_contents($this->apiUrl,false,stream_context_create(array(
            'key'=>$this->key,
            'serial'=>$uniqId,
            'request'=>$this->encrypt($this->encrypt(http_build_query($params), $uniqId), $this->secret)
        )));

        $return=array();
        parse_str($this->decrypt($ret, $this->secret),$return);
        return $return;
    }

    /**
     * 处理异步请求
     * 应用在调用异步请求后,不要等待返回值,页面会跳转到自有用户中心
     * 自有用户中心在完成处理后,会主动跳转回应用,并带相应参数
     * @param unknown_type $action 接口名称
     * @param unknown_type $redirect 回调地址
     * @param unknown_type $params 其它参数
     */
    private function async($action,$redirect,$params=array()){
        $uniqId=uniqid();
        $params['redirect']=$redirect;
        header('Location:'.$this->apiUrl);
        
        echo http_build_query(array(
            'key'=>$this->key,
            'serial'=>$uniqId,
            'request'=>$this->encrypt($this->encrypt(http_build_query($params), $uniqId), $this->secret)
        ));
        exit;        
    }

    /**
     * 解密
     * @param unknown_type $content 密文
     * @param unknown_type $key 密钥
     */
    private function decrypt($content,$key){
        <保密>
    }

    /**
     * 加密
     * @param unknown_type $content 明文
     * @param unknown_type $key 密钥
     */
    private function encrypt($content,$key){
        <保密>
    }
}
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(52) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值