public async Task <ActionResult <GetRedirectResult> > GetRedirect([FromRoute] string type,
                                                                          [FromQuery] GetRedirectRequest request)
        {
            var host      = ApiUtils.GetHost(Request);
            var oAuthType = OAuthType.Parse(type);

            var userName = string.Empty;

            if (oAuthType == OAuthType.Weixin)
            {
                var settings = await _loginManager.GetWeixinSettingsAsync();

                var client = new WeixinClient(settings.WeixinAppId, settings.WeixinAppSecret, host, request.RedirectUrl);

                var userInfo = await client.GetUserInfoAsync(request.Code);

                userName = await _oAuthRepository.GetUserNameAsync(OAuthType.Weixin.Value, userInfo.UnionId);

                if (string.IsNullOrEmpty(userName))
                {
                    var user = new User
                    {
                        UserName = await _userRepository.IsUserNameExistsAsync(userInfo.Nickname)
                            ? Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "")
                            : userInfo.Nickname,
                        DisplayName = userInfo.Nickname,
                        AvatarUrl   = userInfo.HeadImgUrl
                    };

                    var(newUser, _) = await _userRepository.InsertAsync(user, Guid.NewGuid().ToString(), PageUtils.GetIpAddress(Request));

                    userName = newUser.UserName;

                    await _oAuthRepository.InsertAsync(new OAuth
                    {
                        Source   = OAuthType.Weixin.Value,
                        UniqueId = userInfo.UnionId,
                        UserName = userName
                    });
                }
            }
            else if (oAuthType == OAuthType.Qq)
            {
                var settings = await _loginManager.GetQqSettingsAsync();

                var client = new QqClient(settings.QqAppId, settings.QqAppKey, host, request.RedirectUrl);

                var userInfo = await client.GetUserInfoAsync(request.Code);

                userName = await _oAuthRepository.GetUserNameAsync(OAuthType.Qq.Value, userInfo.UniqueId);

                if (string.IsNullOrEmpty(userName))
                {
                    var user = new User
                    {
                        UserName = await _userRepository.IsUserNameExistsAsync(userInfo.DisplayName)
                            ? Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "")
                            : userInfo.DisplayName,
                        DisplayName = userInfo.DisplayName,
                        AvatarUrl   = userInfo.AvatarUrl
                    };

                    var(newUser, _) = await _userRepository.InsertAsync(user, Guid.NewGuid().ToString(), PageUtils.GetIpAddress(Request));

                    userName = newUser.UserName;

                    await _oAuthRepository.InsertAsync(new OAuth
                    {
                        Source   = OAuthType.Qq.Value,
                        UniqueId = userInfo.UniqueId,
                        UserName = userName
                    });
                }
            }
            else if (oAuthType == OAuthType.Weibo)
            {
                var settings = await _loginManager.GetWeiboSettingsAsync();

                var client = new WeiboClient(settings.WeiboAppKey, settings.WeiboAppSecret, host, request.RedirectUrl);

                var userInfo = await client.GetUserInfoAsync(request.Code);

                userName = await _oAuthRepository.GetUserNameAsync(OAuthType.Weibo.Value, userInfo.UnionId);

                if (string.IsNullOrEmpty(userName))
                {
                    var user = new User();
                    user.UserName = await _userRepository.IsUserNameExistsAsync(userInfo.Name)
                        ? Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "")
                        : userInfo.Name;

                    user.DisplayName = userInfo.ScreenName;
                    user.AvatarUrl   = userInfo.AvatarLarge;

                    var(newUser, _) = await _userRepository.InsertAsync(user, Guid.NewGuid().ToString(), PageUtils.GetIpAddress(Request));

                    userName = newUser.UserName;

                    await _oAuthRepository.InsertAsync(new OAuth
                    {
                        Source   = OAuthType.Weibo.Value,
                        UniqueId = userInfo.UnionId,
                        UserName = userName
                    });
                }
            }

            var token = _authManager.AuthenticateUser(await _userRepository.GetByUserNameAsync(userName), true);

            if (oAuthType == OAuthType.Qq || oAuthType == OAuthType.Weibo)
            {
                return(Redirect(PageUtils.AddQueryString(request.RedirectUrl, $"token={token}")));
            }
            else
            {
                return(new GetRedirectResult
                {
                    RedirectUrl = request.RedirectUrl,
                    Token = token
                });
            }
        }