[关闭]
@myyzs 2020-06-08T08:49:44.000000Z 字数 2866 阅读 77

获取用户信息接口

获取用户信息接口


实现原理

1.应用在需要登录的时候跳转到云助手链接地址上,云助手首先验证TICKET的合法性,验证通过后,会根据参数和当前用户环境获取到用户信息,然后通过AES加密用户信息,拼接到REDIRECT_URL?user_info=xxxxxx,重新跳转到应用的地址上面,应用通过解密用户信息,实现应用的免登.

链接地址

https://www.fdccloud.com/api/yzs-sdk/get-user?tenant_id=TENANT_ID&from=FROM&app_code=APP_CODE&channel_id=CHANNEL_ID&time=TIME&ticket=TICKET&redirect_url=REDIRECT_URL

参数值说明

参数 说明
TENANT_ID 云助手租户的tenant_id,唯一值
FROM 使用的app环境常用的有wzs(云助手),dingtalk(钉钉),wx(企业微信)
APP_CODE 做集成的应用code
CHANNEL_ID 渠道ID,用来获取对应的组织架构的用户,选项值有 -2:获取企业通讯录的用户信息;-1:获取当前域用户的信息;0 :获取当前erp的用户信息;2:云服务;3:云采购;4:项目跟投;5:工程协同;6:云客;7:云空间;
TIME 时间戳(秒)
TICKET 身份票据,用来检测请求参数的合法性
REDIRECT_URL 重定向地址,在云助手获取完用户信息后会重新跳转到此地址,在此地址后面追加user_info参数,应用通过AES解密此参数可以获取用户信息

TICKET生成规则

拼接字符串 string = TENANT_ID+APP_CODE+CHANNEL_ID+FROM+TIME;
然后使用Aes加密,秘钥为云助手分配给应用的秘钥
最后把Aes加密的结果使用md5加密
php代码如下

$string = $tenantId.$appCode.$channelId.$from.$time;
$ticket =  md5(AesHelper::encrypt($string,$appSecret));

解析用户身份

REDIRECT_URL?user_info=xxxxxx,应用在REDIRECT_URL的程序中通过GET方法获取到user_info参数,然后使用Aes方法,应用的秘钥来解密。最后解析json即可获得用户信息!

php代码如下:

$userInfo = I('user_info');
$user = json_decode(YzsSdk\helpers\AesHelper::decrypt($userInfo,APP_SECRET),true);
/*** user的里内容
* [
*    "user_guid"=>"xxxx",
*    "user_code"=>"zhangsan",
*     "user_name"=>"张三"
*  ]
*
*/

C#Aes方法源码

public class AESHelper
{
    private static readonly string pass = "1234";

    public static string AES_Encrypt(string input)
    {
        return AESHelper.AES_Encrypt(input, AESHelper.pass);
    }

    public static string AES_Decrypt(string input)
    {
        return AESHelper.AES_Decrypt(input, AESHelper.pass);
    }

    public static string AES_Encrypt(string input, string pass)
    {
        RijndaelManaged rijndaelManaged = new RijndaelManaged();
        MD5CryptoServiceProvider mD5CryptoServiceProvider = new MD5CryptoServiceProvider();
        string result;
        try
        {
            byte[] array = new byte[32];
            byte[] sourceArray = mD5CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(pass));
            Array.Copy(sourceArray, 0, array, 0, 16);
            Array.Copy(sourceArray, 0, array, 15, 16);
            rijndaelManaged.Key = array;
            rijndaelManaged.Mode = CipherMode.ECB;
            ICryptoTransform cryptoTransform = rijndaelManaged.CreateEncryptor();
            byte[] bytes = Encoding.UTF8.GetBytes(input);
            string text = Convert.ToBase64String(cryptoTransform.TransformFinalBlock(bytes, 0, bytes.Length));
            result = text;
        }
        catch (Exception)
        {
            result = "";
        }
        return result;
    }

    public static string AES_Decrypt(string input, string pass)
    {
        RijndaelManaged rijndaelManaged = new RijndaelManaged();
        MD5CryptoServiceProvider mD5CryptoServiceProvider = new MD5CryptoServiceProvider();
        string result;
        try
        {
            byte[] array = new byte[32];
            byte[] sourceArray = mD5CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(pass));
            Array.Copy(sourceArray, 0, array, 0, 16);
            Array.Copy(sourceArray, 0, array, 15, 16);
            rijndaelManaged.Key = array;
            rijndaelManaged.Mode = CipherMode.ECB;
            ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor();
            byte[] array2 = Convert.FromBase64String(input);
            string @string = Encoding.UTF8.GetString(cryptoTransform.TransformFinalBlock(array2, 0, array2.Length));
            result = @string;
        }
        catch (Exception)
        {
            result = "";
        }
        return result;
    }
}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注