Ios 在react native中集成FirebaseUI身份验证
我已经设法(几乎)将FirebaseUI身份验证集成到iOS中的react本机应用程序中。我可以单击react native按钮,加载firebase身份验证流,并在登录后向react native javascript函数发送回调。我可以使用firebase用户的UID或refreshToken调用该函数 不过,我一直在努力利用这一点。是否可以仅使用UID或刷新令牌在react native中将用户登录到firebase 编辑:添加一些代码,但我相信它可能会使用一些与此问题无关的重构: 在ios文件夹中 在AppDelegate.m中 在RCTFirebaseAuthUI.m中 以自然反应 在ProfileScreen.js中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
从“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>
)
}
}
}