Ejemplo n.º 1
0
        public async Task <IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var verifiedAccessToken = await usersService.VerifyExternalAccessToken(model.Provider, model.ExternalAccessToken);

            if (verifiedAccessToken == null)
            {
                return(BadRequest("Invalid Provider or External Access Token"));
            }

            User user = await usersService.FindAsync(new UserLoginInfo(model.Provider, verifiedAccessToken.user_id));

            bool hasRegistered = user != null;

            if (hasRegistered)
            {
                return(BadRequest("External user is already registered"));
            }

            user = usersService.GetNewUser(model.UserName, model.Email);

            IdentityResult result = await usersService.CreateAsync(user);

            if (!result.Succeeded)
            {
                return(BadRequest(string.Join("\n", result.Errors)));
            }
            badgesService.AddInitialBadge(user);
            var info = new ExternalLoginInfo()
            {
                DefaultUserName = model.UserName,
                Login           = new UserLoginInfo(model.Provider, verifiedAccessToken.user_id)
            };

            result = await usersService.AddLoginAsync(user.Id, info.Login);

            if (!result.Succeeded)
            {
                return(BadRequest(string.Join("\n", result.Errors)));
            }

            var accessTokenResponse = usersService.GenerateLocalAccessTokenResponse(model.UserName, user.Id);

            return(Ok(accessTokenResponse));
        }