Hi Fred, Yes, there is really an "Auth" token in the response. Since all three tokens (SID, LSID and Auth) will be returned in the response, my guess is that your current code logic just skips the second and third tokens as the first condition of the "if" statement is satisfied. You may want to update your code logic and create an array to store all three tokens for other services. For example, the Reporting API is using the SID.
Thanks, --Tony On Dec 3, 5:13 pm, NCCFred <[EMAIL PROTECTED]> wrote: > Hi Julian, > > Thanks for the code sample, it took me sometime to actually understand > exactly where this belonged. I was able to add that Constructor code > to the AppsService Class and recompile the project which produced 3 > new DLL's (Extensions.dll, Client.dll and Apps.dll). I copied these > to the correct location on my machine and made a small test app (see > code below). > > Questions: > 1. Am I supposed to get a value for "Auth"? The documentation says I > will get a SID, LSID and Auth, I do not see the "Auth". I assumed to > use the SID and got the following error below when trying to > RetrieveAllUsers(); > > Exception/Error: > Execution of request > failed:https://www.google.com/a/feeds/students.ncc.edu/user/2.0 > > Google.GData.Client.GDataRequestException was unhandled > Message="Execution of request > failed:https://www.google.com/a/feeds/students.ncc.edu/user/2.0" > Source="Google.GData.Apps" > ResponseString="<HTML>\n<HEAD>\n<TITLE>Token invalid</TITLE>\n</HEAD> > \n<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n<H1>Token invalid</H1> > \n<H2>Error 401</H2>\n</BODY>\n</HTML>\n" > StackTrace: > at Google.GData.Apps.UserService.Query(UserQuery feedQuery) > at Google.GData.Apps.AppsService.RetrieveAllUsers() > at GoogleMod.Program.Main(String[] args) in C:\Documents and > Settings\Administrator\Desktop\TempVS\GoogleMod\GoogleMod > \Program.cs:line 30 > at System.AppDomain._nExecuteAssembly(Assembly assembly, String > [] args) > at System.AppDomain.ExecuteAssembly(String assemblyFile, > Evidence assemblySecurity, String[] args) > at > Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() > at System.Threading.ThreadHelper.ThreadStart_Context(Object > state) > at System.Threading.ExecutionContext.Run(ExecutionContext > executionContext, ContextCallback callback, Object state) > at System.Threading.ThreadHelper.ThreadStart() > > My Code: > Program.cs > --------------------- > > using System; > using System.Collections.Generic; > using System.Text; > using Google.GData.Apps; > using Google.GData.Extensions; > using Google.GData.Client; > using System.Web; > using System.Net; > using System.Diagnostics; > using System.IO; > > namespace GoogleMod > { > class Program > { > static void Main(string[] args) > { > UserFeed feed = null; > > string email = "[EMAIL PROTECTED]"; > string password = "XXXXX"; > > string SID = GetSecurityToken(email, password); > Debug.WriteLine("SID = " + SID); > > AppsService service = new AppsService("students.ncc.edu", > SID); > > try > { > feed = service.RetrieveAllUsers(); > > for (int i = 0; i < feed.Entries.Count; i++) > { > UserEntry entry = feed.Entries[i] as UserEntry; > > Debug.WriteLine(entry.Name.FamilyName); > Debug.WriteLine(entry.Name.GivenName); > Debug.WriteLine(entry.Login.UserName); > } > > } > catch (AppsException e) > { > Debug.WriteLine(e.ErrorCode); > Debug.WriteLine(e.Data); > Debug.WriteLine(e.Message); > Debug.WriteLine(e.Reason); > Debug.WriteLine(e.Response); > Debug.WriteLine(e.ResponseString); > Debug.WriteLine(e.Source); > } > > } > > static string GetSecurityToken(string email, string password) > { > string postBody = string.Format( > "accountType=HOSTED&Email={0}&Passwd={1}", > HttpUtility.UrlEncode(email), > HttpUtility.UrlEncode(password)); > > string targetUrl = "https://www.google.com/accounts/ > ClientLogin"; > > string result; > HttpStatusCode status; > > WebUtility.DoHttpPost(targetUrl, postBody, out status, out > result); > > string sid = string.Empty; > string lsid = string.Empty; > > foreach (string token in result.Split('\n')) > { > if (token.StartsWith("SID=")) > { > sid = token.Substring(4); > } > else if (token.StartsWith("LSID=")) > { > lsid = token.Substring(5); > } > else > { > if (token.Trim().Length > 0) > { > Debug.WriteLine("Error authenticating Google > user " + email); > } > } > } > > return sid; > } > > } > > } > > WebUtility.cs > ---------------------- > > using System; > using System.IO; > using System.Net; > using System.Text; > > namespace GoogleMod > { > /// <summary> > /// Provides convenience methods for issuing a HTTP "POST" command > and returning the results. > /// </summary> > public class WebUtility > { > private WebUtility() { ;} > > public static HttpWebResponse DoHttpPost(string targetUrl, > string postBody) > { > HttpWebRequest request = > (HttpWebRequest)WebRequest.Create(targetUrl); > > request.Method = "POST"; > > Encoding encoding = Encoding.GetEncoding("ISO-8859-1"); > > byte[] postBuffer = encoding.GetBytes(postBody); > > request.ContentLength = postBuffer.Length; > request.ContentType = "application/x-www-form-urlencoded"; > > using (Stream requestStream = request.GetRequestStream()) > { > requestStream.Write(postBuffer, 0, postBuffer.Length); > } > > HttpWebResponse response; > > try > { > response = (HttpWebResponse)request.GetResponse(); > } > catch (WebException we) > { > response = (HttpWebResponse)we.Response; > } > > return response; > } > > public static void DoHttpPost(string targetUrl, string > postBody, > out HttpStatusCode resultCode, out string resultBody) > { > HttpWebResponse response = DoHttpPost(targetUrl, > postBody); > > using (StreamReader reader = new StreamReader > (response.GetResponseStream())) > { > resultCode = response.StatusCode; > resultBody = reader.ReadToEnd(); > } > } > } > > } > > On Dec 3, 11:14 am, "Julian (Google)" <[EMAIL PROTECTED]> wrote: > > > Hi Fred, > > > To be able to reuse a cached token, you need to modify the AppsService > > by adding the following constructor: > > > public AppsService(string domain, string authenticationToken) > > { > > this.domain = domain; > > this.applicationName = "apps-" + domain; > > > emailListRecipientService = new EmailListRecipientService > > (applicationName); > > emailListRecipientService.SetAuthenticationToken > > (authenticationToken); > > ((GDataRequestFactory) > > emailListRecipientService.RequestFactory).KeepAlive = false; > > > emailListService = new EmailListService(applicationName); > > emailListService.SetAuthenticationToken > > (authenticationToken); > > ((GDataRequestFactory) > > emailListService.RequestFactory).KeepAlive = false; > > > nicknameService = new NicknameService(applicationName); > > nicknameService.SetAuthenticationToken > > (authenticationToken); > > ((GDataRequestFactory) > > nicknameService.RequestFactory).KeepAlive = false; > > > userAccountService = new UserService(applicationName); > > userAccountService.SetAuthenticationToken > > (authenticationToken); > > ((GDataRequestFactory) > > userAccountService.RequestFactory).KeepAlive = false; > > } > > > This will allow you to specify a Authentication Token instead of > > username and password. > > > If you need to perform many operations I recommend using Threads, for > > example 10 running instances of AppService will help you speed up the > > process, you would need to make few modifications to the client to be > > able to use Threads. > > > The number of users is usually updated every 24 hours, I ran a fix > > script and it should be back to normal at the moment. > > > Cheers, > > Julian > > > On Dec 1, 5:06 pm, NCCFred <[EMAIL PROTECTED]> wrote: > > > > Hi Julian, > > > > Thanks for the response. I can verify that I’m only using one object > > > throughout my application. I might have a very poor work around for > > > this issue. Before I run my C# application I go > > > tohttps://www.google.com/a/students.ncc.edu/UnlockCaptchaandmanually > > > unlock the Captcha. After I manually unlock the Captcha, I run my > > > application and was able to delete 500+ users with no problem. > > > > Also I'd like to add that I don't know if there's a way via the .NET > > > API to isolate the Token that's "inside" of the AppsService object. > > > Many suggestions in the Help and FAQ make it sound simple to cache or > > > save this token but I think it’s geared more towards a Java developer > > > and that framework, not the .NET API. Would you or your team be able > > > to provide a sample C# application that isolates the AppsService > > > token? > > > > Thanks in advance. > > > > Fred > > > > P.S. I have another issue of my “Dashboard” showing a negative number > > > of users, -1636 to be exact. I don’t know if there two issues are > > > related but I wanted to let you know. I have already opened up a > > > ticket for the negative user issue. > > > > On Dec 1, 10:17 am, "Julian (Google)" <[EMAIL PROTECTED]> wrote: > > > > > Hi Fred, > > > > > I will investigate further this issue. > > ... > > read more » --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Apps APIs" 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/google-apps-apis?hl=en -~----------~----~----~----~------~----~------~--~---
