Пример #1
0
        private static void ValidateFacebookAccessToken(FacebookLogInRequest request)
        {
            var client = new FacebookClient(request.FacebookAccessToken);
            //https://developers.facebook.com/tools/explorer/?method=GET&path=me%3Ffields%3Dpicture.width(200).height(200)%2Cemail&version=v2.9
            var     query       = "me?fields=picture.height(200).width(200),email,first_name,last_name";
            dynamic queryResult = client.Get(query);

            if (request.FacebookAppScopeUserId != Convert.ToInt64(queryResult.id) ||
                request.Email != (string)queryResult.email)
            {
                throw new InvalidOperationException("invalid Facebook access token");
            }
        }
Пример #2
0
        private IUser CreateNewUser(FacebookLogInRequest request)
        {
            var userParam = new CreateUserParams(
                request.FirstName,
                GeneratePassword(8),
                request.Email,
                null,
                null,
                true
                );

            return(membershipService.CreateUser(userParam));
        }
Пример #3
0
        private async Task <string> UploadProfileImage(FacebookLogInRequest request)
        {
            // Remove query string path
            var pathWithOutQueryString = Regex.Replace(request.ProfilePictureUrl, @"\?.*", "");
            var fileExtension          = Path.GetExtension(pathWithOutQueryString);

            var now          = DateTime.UtcNow;
            var fileName     = $"file-{now.ToString("yyyy-MM-dd-HH-mm-ss")}-{Guid.NewGuid()}{fileExtension}";
            var fileFullName = url.Combine(
                "uploaded",
                now.ToString("yyyy/MM/dd/HH"),
                fileName);

            MemoryStream memoryStream;

            using (var webClient = new WebClient()) {
                var fileData = await webClient
                               .DownloadDataTaskAsync(request.ProfilePictureUrl);

                memoryStream = new MemoryStream(fileData);
            }

            using (var client = new AmazonS3Client(
                       commonSettingPart.AwsAccessKey,
                       commonSettingPart.AwsSecretKey,
                       Amazon.RegionEndpoint.APSoutheast1))
                using (memoryStream) {
                    var putRequest = new PutObjectRequest {
                        BucketName   = awsS3SettingPart.AwsS3BucketName,
                        InputStream  = memoryStream,
                        StorageClass = S3StorageClass.ReducedRedundancy,
                        //todo dynamic content type
                        ContentType = "image/jpg",
                        CannedACL   = S3CannedACL.PublicRead
                    };

                    putRequest.Metadata.Add("x-amz-meta-title", fileName);
                    putRequest.Key = fileFullName;

                    await client.PutObjectAsync(putRequest);

                    return(url.Combine(
                               awsS3SettingPart.AwsS3ServiceUrl,
                               awsS3SettingPart.AwsS3BucketName,
                               fileFullName));
                }
        }
Пример #4
0
        private async Task <IUser> UpdateFacebookUserPart(FacebookLogInRequest request, IUser user)
        {
            // Update UserPart
            var userPart = user.ContentItem.As <UserPart>();

            userPart.UserName           = request.FirstName;
            userPart.NormalizedUserName = userPart.UserName.ToLowerInvariant();

            // Update user Facebook profile
            var facebookUser = user.ContentItem.As <FacebookUserPart>();

            facebookUser.FirstName         = request.FirstName;
            facebookUser.LastName          = request.LastName;
            facebookUser.ProfilePictureUrl = await UploadProfileImage(request);

            var updatedUser = userPart as IUser;

            return(updatedUser);
        }
Пример #5
0
        public async Task <ActionResult> Connect(FacebookLogInRequest request, FormCollection form)
        {
            // TODO better error response to client to show why we have error
            ValidateFacebookAccessToken(request);
            var user = GetUser(request);

            if (user == null)
            {
                user = CreateNewUser(request);
            }

            // Always update profile if user make a request to connect because we have chance to get new Facebook information
            user = await UpdateFacebookUserPart(request, user);

            // Server side sign in
            auth.SignIn(user, true);
            // Update last log in, to make valid cookie to client side
            userEventHandler.LoggedIn(user);
            return(new JsonResult());
        }
Пример #6
0
        private IUser GetUser(FacebookLogInRequest request)
        {
            var user = auth.GetAuthenticatedUser();

            // If user already logged in return existing user
            if (user != null)
            {
                return(user);
            }

            user = orchardService.ContentManager.Query <UserPart, UserPartRecord>()
                   .Where <UserPartRecord>(x => x.Email == request.Email)
                   .List <IUser>()
                   .SingleOrDefault();
            // If user has not logged in return existing user
            if (user != null)
            {
                return(user);
            }

            return(null);
        }