TweetHarbor.Controllers.AccountController.OAuthComplete C# (CSharp) Method

OAuthComplete() public method

For twitter For AppHb
public OAuthComplete ( string Id, string Client, string ReturnUrl ) : System.Web.Mvc.ActionResult
Id string
Client string
ReturnUrl string
return System.Web.Mvc.ActionResult
        public ActionResult OAuthComplete(string Id, string Client, string ReturnUrl)
        {
            var user = Clients[Client.ToLower()].OAuthCallback(Request);
            ActionResult result = null;
            if (null != user)
            {
                // Log the user in
                authentication.SetAuthCookie(user.UserName, true);

                // ensure the unique id has been set
                if (string.IsNullOrEmpty(user.UniqueId))
                {
                    user.UpdateUniqueId();
                    database.SaveChanges();
                }

                // make sure we have a username and email set -- if not, require account setup
                // TODO: Add this check somewhere else -- here they can nav away and we'll only
                // get them when they try again
                if (string.IsNullOrEmpty(user.UserName) || string.IsNullOrEmpty(user.EmailAddress))
                {
                    result = RedirectToAction("AccountSetup", new { Id = user.UniqueId, ReturnUrl = ReturnUrl });
                }
                else
                {
                    if (string.IsNullOrEmpty(ReturnUrl))
                    {
                        result = RedirectToAction("Index", new { Controller = "Account" });
                    }
                    else
                    {
                        result = Redirect(ReturnUrl);
                    }
                }
            }

            return result;

            string Code = Request["Code"];

            //Workaround for now since AppHb doesn't seem to support passing parameters back
            //UPDATE: Appends extra ?
            if (Client == null)
                Client = Request["?Client"];
            switch (Client.ToLower())
            {

                // We will be moving to using this method later
                case "twitter":
                    throw new NotImplementedException("This path has not been implemented yet");
                    break;
                case "appharbor":
                    var clientId = ConfigurationManager.AppSettings["AppHarborOAuthClientId"];
                    var secret = ConfigurationManager.AppSettings["AppHarborOAuthSecret"];

                    break;
                default:
                    throw new InvalidOperationException("That is not a recognized OAuth client: " + Client);
                    break;
            }
        }

Usage Example

        public void AuthorizeCallback_ExistingUser()
        {
            var db = new TestTweetHarborDbContext();
            var ts = new Mock<ITweetHarborTwitterService>();
            string token = Guid.NewGuid().ToString();
            string verifier = Guid.NewGuid().ToString();
            string TestUsername = "******";
            string imageUrl = "http://test.com/image.jpg";

            var user = UserHelper.ArrangeNewUserDefault();
            db.Users.Add(user);

            ts.Setup<OAuthAccessToken>(a => a.GetAccessToken(It.IsAny<OAuthRequestToken>(), It.IsAny<string>())).Returns(new OAuthAccessToken() { Token = token, TokenSecret = verifier });
            ts.Setup<TwitterUser>(a => a.VerifyCredentials()).Returns(new TwitterUser() { ScreenName = TestUsername, ProfileImageUrl = imageUrl });

            var auth = new Mock<IFormsAuthenticationWrapper>();

            var controller = new AccountController(db, ts.Object, auth.Object);
            controller.SetFakeControllerContext();
            var val = controller.OAuthComplete(null, "Twitter", null);

            Assert.AreEqual(1, db.Users.Count());
            Assert.AreEqual(token, db.Users.First().AuthenticationAccounts.FirstOrDefault(ac => ac.AccountProvider == "twitter").OAuthToken);
            Assert.AreEqual(verifier, db.Users.First().AuthenticationAccounts.FirstOrDefault(ac => ac.AccountProvider == "twitter").OAuthTokenSecret);
            Assert.AreEqual(TestUsername, db.Users.First().AuthenticationAccounts.FirstOrDefault(ac => ac.AccountProvider == "twitter").UserName);
            Assert.AreEqual(imageUrl, db.Users.First().UserProfilePicUrl);
        }