Firebase Twitter oAuth 回调不适用于 Swift ios13

Posted

技术标签:

【中文标题】Firebase Twitter oAuth 回调不适用于 Swift ios13【英文标题】:Firebase Twitter oAuth callback not working for Swift ios13 【发布时间】:2020-04-23 00:17:55 【问题描述】:

我已经按照https://firebase.google.com/docs/auth/ios/twitter-login 上的说明操作了 Swift 的 T 并且我得到了 Web 弹出窗口以授权我在 Twitter Dev 上创建的应用程序,调用回调,然后 webview 位于 about:blank 的空白页面上.什么都做不了,只能单击完成按钮,然后导致错误域 = FIRAuthErrorDomain 代码 = 17058 “用户取消了交互。” 回调地址正确。我使用 Twitter Consumer API Keys 作为在 Firebase 控制台中输入的密钥。

我错过了什么?

【问题讨论】:

您是否在 info.plist 的 URL 类型中添加了 twitterkit-xxxxxxxxxxxxxxx 值作为 URL 方案?您还需要在项目信息 URL 类型部分手动添加此 twitterkit-xxxxxxxxxxxxxxx 值。 我没有使用 Twitter 用来开发的 twitterkit。它已存档在 github 上,不再受支持。只是尝试使用 firebase 指令。 当我在 twitter Webview 弹出窗口中单击 Authorize App 时,它会重定向到:myappname.firebaseapp.com/__/auth/…。但随后什么也没有发生,它只是坐在一个空白页面上,没有返回凭据。 我也尝试了firebase的说明,但我没有这样做。然后我使用了 twitterkit,它也在 iOS 13 中运行。我知道它已被弃用,但如果没有它,我将无法管理 firebase twitter 社交登录。 你有没有让这个工作?我在使用 twitterkit,现在需要换成别的东西。 【参考方案1】:

好的,所以我解决了这个问题,但现在不完全确定如何解决。我相信这是因为没有发出回调,因此没有被应用程序接收。由于身份验证,回调不是问题,我相信是因为我没有创建服务条款和隐私政策。因此,请确保您已在 Twitter 开发页面中完成此操作。

在twitter dev页面中,回调链接为:https://yourApp.firebaseapp.com/__/auth/handler 当您启用 twitter 时,您会在 Firebase 身份验证设置中找到它。

确保在 info.plist LSApplicationQueriesSchemes 中有一个数组: 推特 推特认证

在您的 swift 文件中:

var provider = OAuthProvider(providerID: "twitter.com")

您的按钮操作:

@IBAction func onCustonTwitterButtonPressed(_ sender: Any) 
    MyAppsCoreServicesScripts.logoutSocial() // My logout routine.
    provider.getCredentialWith(nil)  credential, error in
    if let error = error 
        MyAppsCoreServicesScripts.showError(prefix: "Twitter Login",error: error, showMsg: true)
         else if credential != nil 
            self.firebaseLogin(credential!)            
        
    

祝你好运!希望这对某人有所帮助。

【讨论】:

能否详细说明您在 LSApplicationQueriesSchemes 中分配了什么?【参考方案2】:

对于所有在回调工作方面仍有问题的人,我设法解决了这个问题。可悲的是,您必须编辑库中的方法(不是最好的方法,但仍然。错误已报告给 firebase 团队)。该方法应如下所示(您可以在名为 FIROAuthProvider.m 的文件中找到它,第 125 行。我故意留下了注释行,所以您会在那里看到问题......希望它对某人有所帮助:)

- (void)getCredentialWithUIDelegate:(nullable id<FIRAuthUIDelegate>)UIDelegate
                         completion:(nullable FIRAuthCredentialCallback)completion 
  if (![FIRAuthWebUtils isCallbackSchemeRegisteredForCustomURLScheme:self->_callbackScheme]) 
    [NSException raise:NSInternalInconsistencyException
                format:@"Please register custom URL scheme '%@' in the app's Info.plist file.",
                       self->_callbackScheme];
  
//  __weak __typeof__(self) weakSelf = self;
//  __weak FIRAuth *weakAuth = _auth;
//  __weak NSString *weakProviderID = _providerID;
  dispatch_async(FIRAuthGlobalWorkQueue(), ^
    FIRAuthCredentialCallback callbackOnMainThread =
        ^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) 
          if (completion) 
            dispatch_async(dispatch_get_main_queue(), ^
              completion(credential, error);
            );
          
        ;
    NSString *eventID = [FIRAuthWebUtils randomStringWithLength:10];
    NSString *sessionID = [FIRAuthWebUtils randomStringWithLength:10];
//    __strong __typeof__(self) strongSelf = weakSelf;
    [self
        getHeadFulLiteURLWithEventID:eventID
                           sessionID:sessionID
                          completion:^(NSURL *_Nullable headfulLiteURL, NSError *_Nullable error) 
                            if (error) 
                              callbackOnMainThread(nil, error);
                              return;
                            
                            FIRAuthURLCallbackMatcher callbackMatcher =
                                ^BOOL(NSURL *_Nullable callbackURL) 
                                  return [FIRAuthWebUtils
                                      isExpectedCallbackURL:callbackURL
                                                    eventID:eventID
                                                   authType:kAuthTypeSignInWithRedirect
                                             callbackScheme:self->_callbackScheme];
                                ;
//                            __strong FIRAuth *strongAuth = weakAuth;
                            [_auth.authURLPresenter
                                     presentURL:headfulLiteURL
                                     UIDelegate:UIDelegate
                                callbackMatcher:callbackMatcher
                                     completion:^(NSURL *_Nullable callbackURL,
                                                  NSError *_Nullable error) 
                                       if (error) 
                                         callbackOnMainThread(nil, error);
                                         return;
                                       
                                       NSString *OAuthResponseURLString =
                                           [self OAuthResponseForURL:callbackURL
                                                                     error:&error];
                                       if (error) 
                                         callbackOnMainThread(nil, error);
                                         return;
                                       
                                       __strong NSString *strongProviderID = _providerID;
                                       FIROAuthCredential *credential = [[FIROAuthCredential alloc]
                                               initWithProviderID:strongProviderID
                                                        sessionID:sessionID
                                           OAuthResponseURLString:OAuthResponseURLString];
                                       callbackOnMainThread(credential, nil);
                                     ];
                          ];
  );

【讨论】:

你节省了我的时间!谢谢! 哇,真的是问题所在,感谢您的帮助!但是这怎么可能还存在呢? 这个!!谢谢你的提示 !我遇到了根本没有调用回调的问题,即使我认为我遵循了 Firebase 教程中的所有步骤。这立即解决了问题。

以上是关于Firebase Twitter oAuth 回调不适用于 Swift ios13的主要内容,如果未能解决你的问题,请参考以下文章

twitter api回调没有重定向?

带有 Rails 5 的 Omniauth-twitter 停止工作! OAuth::Unauthorized 403 Forbidden

React JS Twitter身份验证Firebase

Twitter oAuth callbackUrl - 本地主机开发

Android:WebView 中的 Twitter - 通过回调返回 Activity

通过弹出窗口进行 Twitter OAuth