views:

64

answers:

1

This issue is giving me serious headaches, I don't have a clue what's going on here. If you don't have any experience with the Windows Live network, I ask you to read this anyway, maybe it has nothing to do with it and am I overlooking something totally unrelated.

In short: I wrote an Objective-C class that allows me to connect to the Windows Live Messenger network, called WLNotificationSession. I works really straightforward, I set the username and password variables and do [notificationSession start];. It then logs in successfully.

Let's say I have two Windows Live accounts. The first one, A, is now logged in.

The problem arises when I try to fire up a second WLNotificationSession, with the other Windows Live account, B. It always fails. The usernames and passwords are 100% correct. When I try to log in B first, it succeeds. When I try A while B is logged in, it fails. The second login session always fails.

It can't be something like "too much log in attempts in a short period of time". When I log in A, quit the app, restart the app and log in A again, both attempts succeed. I can do this within 20 seconds. But, when I fire up the app, log A in, disconnect A, wait 2 hours, log in B (all without closing the app), it fails. (??)

For those of you with experience with the WL network: the failure occurs during the Tweener authentication. The part where you get the "Authentication-Info" or "WWW-Authenticate" HTTP header from the login server. When it fails, I get this value: "Www-Authenticate" = "Passport1.4 da-status=failed-noretry,srealm=Passport.NET,ts=-2,prompt,cburl=http://messenger.msn.com/images/logo102x88.gif,cbtxt=.NET%20Messenger%20Service";

I really hope someone can help with this. Thank you.

UPDATE This is some example code. I create a new project, add this code in the applicationDidFinishLaunching method and click Build & Run:

WLNotificationSession *notificationSession1 = [[WLNotificationSession alloc] init];

notificationSession1.username = @"[email protected]";

notificationSession1.password = @"testpwd";

[notificationSession1 start];

WLNotificationSession *notificationSession2 = [[WLNotificationSession alloc] init];

notificationSession2.username = @"[email protected]";

notificationSession2.password = @"testpwd";

[notificationSession2 start];

notificationSession1 always succeeds, notificationSession2 always fails. No global variables, or shared variables whatsoever.

UPDATE 2

Following David's suggestion the problem could be cookie-related, I added this code to my project: [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];

I also use his method in the comments below to delete any cookies before and after each URL request. This is probably unnecessary, but I do it anyway.

I think at this point it is safe to assume it's not the cookies, or there has to be some other place where cookies are stored.

+1  A: 

No global variables, or shared variables whatsoever

Then, as the authentication is performed using http request, this could be cookie issue. There might be some session cookie reminding the server about the former session.

I know that FBConnect (Facebook API for iPhone) uses the following method when logging out to remove any cookie :

- (void)deleteFacebookCookies {
  NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray* facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];
  for (NSHTTPCookie* cookie in facebookCookies) {
    [cookies deleteCookie:cookie];
  }
}

You could try this (replace facebook url with yours). You could even add some NSLogs to watch for these cookies.

David
Well, it certainly made sense to me and I was hoping this would be the problem.. but unfortunately, the issue remains. I am using your code to delete all cookies all the time, AND I am using this: `[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];` I think this should eliminate the possibility of cookies messing up, right?
Rits
Never mind. It works. The cookie thing did the trick. Thanks a lot man.
Rits