Ios 在react native中集成FirebaseUI身份验证

Ios 在react native中集成FirebaseUI身份验证,ios,firebase,react-native,firebase-authentication,Ios,Firebase,React Native,Firebase Authentication,我已经设法(几乎)将FirebaseUI身份验证集成到iOS中的react本机应用程序中。我可以单击react native按钮,加载firebase身份验证流,并在登录后向react native javascript函数发送回调。我可以使用firebase用户的UID或refreshToken调用该函数 不过,我一直在努力利用这一点。是否可以仅使用UID或刷新令牌在react native中将用户登录到firebase 编辑:添加一些代码,但我相信它可能会使用一些与此问题无关的重构: 在io

我已经设法(几乎)将FirebaseUI身份验证集成到iOS中的react本机应用程序中。我可以单击react native按钮,加载firebase身份验证流,并在登录后向react native javascript函数发送回调。我可以使用firebase用户的UID或refreshToken调用该函数

不过,我一直在努力利用这一点。是否可以仅使用UID或刷新令牌在react native中将用户登录到firebase

编辑:添加一些代码,但我相信它可能会使用一些与此问题无关的重构:

在ios文件夹中

在AppDelegate.m中 在RCTFirebaseAuthUI.m中 以自然反应

在ProfileScreen.js中
从“firebase”导入*作为firebase;
导出默认类ProfileScreen扩展组件{
注销=()=>{
firebase.auth().signOut()
}
setUid=(错误,令牌)=>{
console.log('rn')
console.log(令牌)
//在这里,我需要登录用户以响应NATIVE的FIREBASE
//firebase.auth().signInWithCredential(令牌).catch((错误)=>
//console.log(错误)
//)
}
pushLoginScreen=()=>{
var loginUI=NativeModules.FirebaseAuthUI
loginUI.showLogin(this.setUid)
}
建造师(道具){
超级(道具);
此.state={
用户:空
};
firebase.auth().onAuthStateChanged((用户)=>{
这是我的国家({
用户:用户
})
})
}
render(){
console.log('render profile')
console.log(this.state.user)
让user=this.state.user
如果(用户!==null){
返回(
{user.email}
)
}否则{
返回(
轮廓
)
}
}
}

你能解释一下你在做什么吗?这似乎并不清楚。一些代码会有帮助。抱歉@bojeil…代码补充可能有一个解决方案。。。我想我需要将ios代码视为firebase自定义身份验证服务器。我将使用私钥生成JWT令牌,将其传递到react native,并使用firebase.auth().signInWithCustomToken(令牌)@MattyB您提到的解决方案
firebase.auth().signInWithCustomToken(令牌))
?“你们的问题解决了吗?”弗朗索朗蒂尼说,技术上可行,但这是个大难题
FUIAuth *authUI;
RCTResponseSenderBlock rnOnLogin;

- (void)authUI:(FUIAuth *)authUI didSignInWithUser:(nullable FIRUser *)user error:(nullable NSError *)error {
  // Implement this method to handle signed in user or error if any.
   RCTLogInfo(@"Logged in (app delegate)");
  if (user == NULL) {
    RCTLogInfo(@"Null User");
  } else {
    RCTLogInfo(@"Got User (app delegate)");
    RCTLogInfo(user.uid);
    RCTLogInfo(user.providerData);
    // HERE I CAN PASS INFO ABOUT USER TO REACT NATIVE
    rnOnLogin(@[[NSNull null], user.providerData]);
  }
  if (error != NULL) {
    RCTLogInfo(@"Got Error  (app delegate)");
    RCTLogInfo(error);
  }
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
  RCTLogInfo(@"openURL application (app delegate)");
  return [[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
}
@implementation RCTFirebaseAuthUI

RCT_EXPORT_MODULE();

UINavigationController *authViewController;
extern FUIAuth *authUI;
extern RCTResponseSenderBlock rnOnLogin;

RCT_EXPORT_METHOD(showLogin:(nonnull RCTResponseSenderBlock )onLogin)
{
  RCTLogInfo(@"showLogin method");

  if(authViewController == nil) {
   authViewController = [authUI authViewController];
   authViewController.delegate = authUI;
  }

  rnOnLogin = onLogin;

  UIWindow *window = [UIApplication sharedApplication].keyWindow;
  UIViewController *rootViewController = window.rootViewController;
  [rootViewController presentViewController:authViewController animated:YES completion:nil];
}
import * as firebase from 'firebase';

export default class ProfileScreen extends Component {

  logout = () => {
    firebase.auth().signOut()
  }

  setUid = (error, token) => {
    console.log('rn')
    console.log(token)

    // HERE I NEED TO LOGIN THE USER TO REACT NATIVE's FIREBASE
    // firebase.auth().signInWithCredential(token).catch((error) =>
    //  console.log(error)
    //)
  }

  pushLoginScreen = () => {
    var loginUI = NativeModules.FirebaseAuthUI
    loginUI.showLogin(this.setUid)
  }

  constructor(props) {
    super(props);
    this.state = {
      user: null
    };
    firebase.auth().onAuthStateChanged((user) => {
      this.setState({
        user: user
      })
    })
  }

  render() {
    console.log('render profile')
    console.log(this.state.user)
    let user = this.state.user
    if (user !== null) {
      return (
        <View>
           <Text>{user.email}</Text>
        </View>
      )
    } else {
      return (
        <View>
          <Text>Profile</Text>
          <Button title="Login" onPress={this.pushLoginScreen} />
        </View>
      )
    }
  }
}