我试图实现一个自定义登录查看到Twitter(我不想要那UIWebView).我下载了很多课程,并且我迄今为止有一个 噩梦 与此有关。现在我试图使Twitter+保护身份验证工作。这里的演示码(工作):

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
_engine.consumerKey = kOAuthConsumerKey;
_engine.consumerSecret = kOAuthConsumerSecret;

[_engine requestRequestToken];

UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

if (controller) 
    [self presentModalViewController: controller animated: YES];
else
    [_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];

现在我想做的事情是替代,SA_OAuthTwitterController与定义UITextFields.所以我想这一点:

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
_engine.consumerKey = kOAuthConsumerKey;
_engine.consumerSecret = kOAuthConsumerSecret;

[_engine requestRequestToken];
[_engine requestAccessToken];
[_engine setUsername:@"username" password:@"password"];
[_engine sendUpdate:@"tweet"];

但是我继续收到错误401中。我可能是缺少一个步骤。任何人吗?

有帮助吗?

解决方案

我觉得比你少在这里,SA_OAuthTwitterEngine.m:103:

    //This generates a URL request that can be passed to a UIWebView. It will open a page in which the user must enter their Twitter creds to validate
- (NSURLRequest *) authorizeURLRequest {
        if (!_requestToken.key && _requestToken.secret) return nil;     // we need a valid request token to generate the URL

        OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL: self.authorizeURL consumer: nil token: _requestToken realm: nil signatureProvider: nil] autorelease];     

        [request setParameters: [NSArray arrayWithObject: [[[OARequestParameter alloc] initWithName: @"oauth_token" value: _requestToken.key] autorelease]]];   
        return request;
}

你将以"虚假"这个用户登录了你自己,我相信,通过发送twitter登录凭证作为一个单独的请求。它的出现,setUsername方法你打电话是实际上称,作为后作一次一个有效的接入令牌已经收到。见SA_OAuthTwitterEngine.m:185

//
// access token callback
// when twitter sends us an access token this callback will fire
// we store it in our ivar as well as writing it to the keychain
// 
- (void) setAccessToken: (OAServiceTicket *) ticket withData: (NSData *) data {
        if (!ticket.didSucceed || !data) return;

        NSString *dataString = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease];
        if (!dataString) return;

        if (self.pin.length && [dataString rangeOfString: @"oauth_verifier"].location == NSNotFound) dataString = [dataString stringByAppendingFormat: @"&oauth_verifier=%@", self.pin];

        NSString                                *username = [self extractUsernameFromHTTPBody:dataString];

        if (username.length > 0) {
                [[self class] setUsername: username password: nil];
                if ([_delegate respondsToSelector: @selector(storeCachedTwitterOAuthData:forUsername:)]) [(id) _delegate storeCachedTwitterOAuthData: dataString forUsername: username];
        }

        [_accessToken release];
        _accessToken = [[OAToken alloc] initWithHTTPResponseBody:dataString];
}

这样的步骤如下:

  1. 请求请求令牌
  2. 假的用户登录到twitter的和得到销价值
  3. 设置脚在引擎
  4. 请接入令牌

你可以看到SA_OAuthTwitterController分析销出webview内容在SA_OAuthTwitterController.m:156

#pragma mark Webview Delegate stuff
- (void) webViewDidFinishLoad: (UIWebView *) webView {
        NSError *error;
        NSString *path = [[NSBundle mainBundle] pathForResource: @"jQueryInject" ofType: @"txt"];
    NSString *dataSource = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];

    if (dataSource == nil) {
        NSLog(@"An error occured while processing the jQueryInject file");
    }

        [_webView stringByEvaluatingJavaScriptFromString:dataSource]; //This line injects the jQuery to make it look better

        NSString                                        *authPin = [[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById('oauth_pin').innerHTML"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        if (authPin.length == 0) authPin = [[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById('oauth_pin').getElementsByTagName('a')[0].innerHTML"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        [_activityIndicator stopAnimating];
        if (authPin.length) {
                [self gotPin: authPin];
        } 
        if ([_webView isLoading] || authPin.length) {
                [_webView setHidden:YES];
        } else {
                [_webView setHidden:NO];
        }
}

希望这会有所帮助。

其他提示

图控制你是消除负荷webview,提示用户进行身份验证应用程序。如果你没有用户进行身份验证,你不能做证的twitter的呼吁。有一种方法来做什么你想要的,但是,你必须要通过所有受保护身份验证的步骤,你自己。这里的步骤如指定从一个 不同的网络服务(Vimeo), 但同一规则适用:

  1. 你的应用程序发送的请求 你的消费者的关键,并签署 你的消费者的秘密, 一些所谓的请求标记。如果 我们核实你的申请 正确,我们会向你发送回来一个 请求令牌和一个令牌的秘密。

  2. 然后你会创造一个链接,用户必须点击相应与请求标记。

  3. 当用户得到Vimeo,他们会允许你 应用程序访问他们的帐户。如果他们击是的,我们会送他们 回到你的申请,随着 一个验证程序。

  4. 然后你会利用请求的标记,验证程序和标记的秘密做
    另一通电话到我们得到一个访问 令牌。接入令牌是什么 你会用到用户的访问 信息Vimeo。

保护身份验证是一个真正的痛苦的臀部,那好运气。;-)

您必须使用 XAUTH 获得自定义用户/通过控制。但是,它需要从Twitter的权限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top