Exemplo n.º 1
0
        private void processBind(AuthConnect connect, String code)
        {
            if (ctx.viewer.IsLogin == false)
            {
                echoError("对不起,请先登录");
                return;
            }

            // 检查是否绑定过
            if (connectService.HasBind(ctx.viewer.Id, connect.GetType().FullName))
            {
                echoError("对不起,已经绑定");
                return;
            }

            // 获取用户 uid
            AccessToken x = OAuthClient.New().GetAccessToken(connect, code, connect.HttpMethod_AccessToken);

            x.Uid = connect.GetUid(x);

            // 获取用户名称
            OAuthUserProfile userProfile = null;

            try {
                userProfile = connect.GetUserProfile(x);
            }
            catch (HttpClientException ex) {
                if (ex.Message.IndexOf("applications over the unaudited use restrictions") > 0)
                {
                    echo(getTestRestrictionsMsg("绑定"));
                    return;
                }
                else
                {
                    throw ex;
                }
            }

            x.Name = userProfile.Name;

            Result result = connectService.Create(ctx.viewer.obj as User, connect.GetType().FullName, x);

            // 日志
            logger.Info("accessToken=" + x.Token);
            logger.Info("uid=" + x.Uid);
            logger.Info("refresh_token=" + x.RefreshToken);
            logger.Info("expires_in=" + x.ExpiresIn);
            logger.Info("scope=" + x.Scope);

            if (result.HasErrors)
            {
                echo(result.ErrorsHtml);
            }
            else
            {
                echoRedirect(lang("opok"), "/");
            }
        }
Exemplo n.º 2
0
        public virtual void Login()
        {
            if (ctx.viewer.IsLogin)
            {
                echoError("对不起,您已经登录");
                return;
            }

            // 1) 登录的第三方类型
            String connectType = ctx.Get("connectType");

            AuthConnect connect = AuthConnectFactory.GetConnect(connectType);

            if (connect == null)
            {
                echoError("连接类型不存在:" + connectType);
                return;
            }

            // 2) 根据类型,redirect到第三方授权。回调网址callback 是 ProcessLogin()
            ctx.web.SessionSet("__connectType", connect.GetType().FullName);
            ctx.web.SessionSet("__connectFrom", "login");

            redirectUrl(connect.GetAuthorizationFullUrl());
        }
Exemplo n.º 3
0
        private void processLogin(AuthConnect connect, String code)
        {
            if (ctx.viewer.IsLogin)
            {
                echoError("对不起,您已经登录");
                return;
            }

            AccessToken accessToken = OAuthClient.New().GetAccessToken(connect, code, connect.HttpMethod_AccessToken);

            logger.Info("accessToken=" + accessToken.Token);
            logger.Info("uid=" + accessToken.Uid);
            logger.Info("refresh_token=" + accessToken.RefreshToken);
            logger.Info("expires_in=" + accessToken.ExpiresIn);
            logger.Info("scope=" + accessToken.Scope);

            String uid = connect.GetUid(accessToken);

            // 1) 检查网站中是否有此用户
            UserConnect x = connectService.GetConnectInfo(uid, connect.GetType().FullName);

            // 第一次登录
            if (x == null)
            {
                try {
                    loadUserProfile(connect, accessToken);
                }
                catch (HttpClientException ex) {
                    if (ex.Message.IndexOf("applications over the unaudited use restrictions") > 0)
                    {
                        echo(getTestRestrictionsMsg("登录"));
                    }
                    else
                    {
                        throw ex;
                    }
                }
            }
            // 其他:获取用户信息,然后登录
            else
            {
                checkAccessToken(x, accessToken);

                LoginTime expiration = LoginTime.OneWeek;
                loginService.Login(x.User, x.Id, expiration, ctx.Ip, ctx);

                echoRedirect("登录成功", "/");
            }
        }
Exemplo n.º 4
0
        public virtual void Bind()
        {
            String connectType = ctx.Get("connectType");

            AuthConnect connect = AuthConnectFactory.GetConnect(connectType);

            if (connect == null)
            {
                echoError("此连接类型不存在:" + connectType);
                return;
            }

            // 检查是否绑定过
            if (connectService.HasBind(ctx.viewer.Id, connect.GetType().FullName))
            {
                echoError("对不起,已经绑定");
                return;
            }

            ctx.web.SessionSet("__connectType", connect.GetType().FullName);
            ctx.web.SessionSet("__connectFrom", "bind");

            redirectUrl(connect.GetAuthorizationFullUrl());
        }
Exemplo n.º 5
0
        public virtual void SaveFirstLogin()
        {
            if (ctx.viewer.IsLogin)
            {
                echoError("对不起,您已经登录");
                return;
            }

            Object connectType = ctx.web.SessionGet("__connectType");

            if (connectType == null)
            {
                echoError("无效的 connect type");
                return;
            }

            AuthConnect connect = AuthConnectFactory.GetConnect(connectType.ToString());

            if (connect == null)
            {
                echoError("此连接类型不存在:" + connectType);
                return;
            }

            AccessToken accessToken = getAccessToken();

            OAuthUserProfile userProfile = connect.GetUserProfile(accessToken);

            if (userProfile == null)
            {
                echoError("无法获取正常 user profile");
                return;
            }

            accessToken.Name = userProfile.Name;

            // 注册用户
            User user = new User();

            user.Name = ctx.Post("userName");
            user.Url  = ctx.Post("userUrl");

            Result result = userService.RegisterNoPwd(user);

            if (result.HasErrors)
            {
                echoError(result);
                return;
            }

            result = AvatarUploader.SaveRemote(userProfile.PicUrlBig, user.Id);
            if (result.IsValid)
            {
                user.Pic = result.Info.ToString();
                user.update();
            }
            else
            {
                echoError(result);
                return;
            }

            // 是否开启空间
            RegHelper.CheckUserSpace(user, ctx);

            // 绑定用户
            Result saveResult = connectService.Create(user, connect.GetType().FullName, accessToken);

            if (saveResult.IsValid)
            {
                UserConnect userConnect = saveResult.Info as UserConnect;
                loginService.Login(user, userConnect.Id, LoginTime.OneWeek, ctx.Ip, ctx);   // 登录
                echoRedirect("登录成功", "/");
            }
            else
            {
                echoError(saveResult);
            }
        }