Hi,

I was hoping someone can point me in the right direction.

in my app i need to be able to connect to other accounts so i have 
implemented oauth2flow which i took from the example app.
it lets me log in to an account just fine and i get the oath object back. I 
can also make a call to the campaign service with no errors returned but 
the campaign page object always returns with no entries.

i don't think its  permission thing because when i run the example app i 
get my test accounts back.

i just wish i had an error to work with

below is my code:

Base controller: (used to store the oauth object between controllers)
public class BaseController : Controller
    {
        protected internal static HttpSessionStateBase MySession { get; 
set; }

        protected internal static OAuth2ProviderForApplications OAuth { 
get; set; }
    }

Auth controller:
[HttpPost]
        public ActionResult AuthUser()
        {
            var config = _user.Config as AdWordsAppConfig;
            if (_user.Config.OAuth2Mode == OAuth2Flow.APPLICATION &&
            string.IsNullOrEmpty(config.OAuth2RefreshToken))
            {
                return RedirectToAction("AuthLogin");
            }
            
            //TODO: need to add error page
            return RedirectToAction("Index");
        }

        public ActionResult AuthLogin()
        {
            AdWordsAppConfig config = new AdWordsAppConfig();
            if (config.OAuth2Mode == OAuth2Flow.APPLICATION &&
                string.IsNullOrEmpty(config.OAuth2RefreshToken))
            {
                DoAuth2Configuration(config);
            }

            return RedirectToAction("Index");
        }

        private void DoAuth2Configuration(AdWordsAppConfig config)
        {
            // Since we use this page for OAuth callback also, we set the 
callback
            // url as the current page. For a non-web application, this 
will be null.
            config.OAuth2RedirectUri = 
Request.Url.GetLeftPart(UriPartial.Path);

            // Create an OAuth2 object for handling OAuth2 flow.
            OAuth2ProviderForApplications oAuth = new 
OAuth2ProviderForApplications(config);

            if (Request.Params["state"] == null)
            {
                // This is the first time this page is being loaded.
                // Set the state variable to any value that helps you 
recognize
                // when this url will be called by the OAuth2 server.
                oAuth.State = "callback";

                // Create an authorization url and redirect the user to 
that page.
                Response.Redirect(oAuth.GetAuthorizationUrl());
            }
            else if (Request.Params["state"] == "callback")
            {
                // This page was loaded because OAuth server did a callback.
                // Retrieve the authorization code from the url and use it 
to fetch
                // the access token. This call will also fetch the refresh 
token if
                // your mode is offline.
                oAuth.FetchAccessAndRefreshTokens(Request.Params["code"]);

                // Save the OAuth2 provider for future use. If you wish to 
save only
                // the values and restore the object later, then save
                // oAuth.RefreshToken, oAuth.AccessToken, oAuth.UpdatedOn 
and
                // oAuth.ExpiresIn.
                //
                // You can later restore the values as
                // AdWordsUser user = new AdWordsUser();
                // user.Config.OAuth2Mode = OAuth2Flow.APPLICATION;
                // OAuth2ProviderForApplications oAuth =
                //     (user.OAuthProvider as 
OAuth2ProviderForApplications);
                // oAuth.RefreshToken = xxx;
                // oAuth.AccessToken = xxx;
                // oAuth.UpdatedOn = xxx;
                // oAuth.ExpiresIn = xxx;
                //
                // Note that only oAuth.RefreshToken is mandatory. If you 
leave
                // oAuth.AccessToken as empty, or if oAuth.UpdatedOn + 
oAuth.ExpiresIn
                // is in the past, the access token will be refreshed by 
the library.
                // You can listen to this event as
                //
                // oAuth.OnOAuthTokensObtained += delegate(AdsOAuthProvider 
provider) {
                //    OAuth2ProviderForApplications oAuth =
                //        (provider as OAuth2ProviderForApplications);
                //    // Save oAuth.RefreshToken, oAuth.AccessToken, 
oAuth.UpdatedOn and
                //    // oAuth.ExpiresIn.
                //};
                Session["OAuthProvider"] = oAuth;
                OAuth = oAuth;
                var t = Session["OAuthProvider"];
                // Redirect the user to the main page.
                Response.Redirect("Index");
            }
            else
            {
                throw new Exception("Unknown state for OAuth callback.");
            }
        }

Reporting controller:
[HttpPost]
        public ActionResult Index(string customerId)
        {
            var test = customerId;

            ConfigureUserForOAuth();

            CampaignService campaignService = 
(CampaignService)_user.GetService(AdWordsService.v201603.CampaignService);

            (_user.Config as AdWordsAppConfig).ClientCustomerId = 
customerId;

            // Create the selector.
            Selector selector = new Selector()
            {
                fields = new string[] {
          Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Status
        },
                paging = Paging.Default
            };

            CampaignPage page = new CampaignPage();

            try
            {
                do
                {
                    // Get the campaigns.
                    page = campaignService.get(selector);

                    // Display the results.
                    if (page != null && page.entries != null)
                    {
                        int i = selector.paging.startIndex;
                        foreach (Campaign campaign in page.entries)
                        {
                            Console.WriteLine("{0}) Campaign with id = 
'{1}', name = '{2}' and status = '{3}'" +
                              " was found.", i + 1, campaign.id, 
campaign.name, campaign.status);
                            i++;
                        }
                    }
                    selector.paging.IncreaseOffset();
                } while (selector.paging.startIndex < page.totalNumEntries);
                Console.WriteLine("Number of campaigns found: {0}", 
page.totalNumEntries);
            }
            catch (Exception e)
            {
                throw new System.ApplicationException("Failed to retrieve 
campaigns", e);
            }

            return null;
        }

        private void ConfigureUserForOAuth()
        {
            AdWordsAppConfig config = (_user.Config as AdWordsAppConfig);
            if (config.OAuth2Mode == OAuth2Flow.APPLICATION &&
                  string.IsNullOrEmpty(config.OAuth2RefreshToken))
            {
                var t = Session["OAuthProvider"];
                var n = OAuth;
                //_user.OAuthProvider = 
(OAuth2ProviderForApplications)Session["OAuthProvider"];
                _user.OAuthProvider = OAuth;
            }
        }

-- 
-- 
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
Also find us on our blog and Google+:
https://googleadsdeveloper.blogspot.com/
https://plus.google.com/+GoogleAdsDevelopers/posts
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~

You received this message because you are subscribed to the Google
Groups "AdWords API Forum" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/adwords-api?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"AdWords API Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/adwords-api.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/adwords-api/8a3f4d7e-05ff-4d8f-b850-836354986d3f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to