当前位置: 首页 > 知识库问答 >
问题:

react native中的redux身份验证状态有问题

薛英卫
2023-03-14

我使用react native和redux,但性能很慢.例如,在初始页面上,我有一个检查系统,如果处于还原状态的用户通过了身份验证,则显示home page,如果没有显示auth屏幕。

当我的用户通过身份验证时,我的应用程序最初会呈现身份验证屏幕几秒钟,然后呈现主屏幕,这是一个糟糕的用户体验,所以我的redux状态可能需要时间更新,而且速度很慢。

请看我的代码并帮助我做错了什么。

我正在检查异步存储中的已验证令牌以确定已验证的用户。

const Root = (props) => {


    useEffect(() => {
        const bootstrapAsync = async () => {
          let token;
        //   token = null;
          try {
            token = await AsyncStorage.getItem('FBIdToken');
          } catch (e) {
            console.log(e);
          }
          if(token !== null){
            const decodedToken = jwtDecode(token);
            if(decodedToken.exp * 1000 < Date.now()) {
              store.dispatch(logoutUser());
            } else {
              store.dispatch({ type: SET_AUTHENTICATED });
              store.dispatch(getUserData());
            }
          }
        };
        bootstrapAsync();
        setIsLoading(false);
      }, []);



    return (
        <NavigationContainer ref={navigationRef}>
        { 
        !props.user.authenticated ? (
            <AuthStackScreen />
        ) : (
            <DrawerScreen />
        )
        }
      </NavigationContainer>
    )
};

const mapStateToProps = (state) => ({
    user: state.user,
    UI: state.UI
});


export default connect(mapStateToProps)(Root);

reducers.js

import { SET_USER, SET_AUTHENTICATED, SET_UNAUTHENTICATED } from '../types';

const initialState = {
    authenticated: false,
    loading: false,
    credentials: {},
    likes: [],
    notifications: []
};

export default function(state = initialState, action){
    switch(action.type){
        case SET_AUTHENTICATED:
            return {
                ...state,
                authenticated: true
            };
        case SET_UNAUTHENTICATED:
            return initialState;
        case SET_USER:
            return {
                authenticated: true,
                loading: false,
                ...action.payload
            };
        default:
            return state;

    }
}

共有1个答案

白和泽
2023-03-14

您有多个选项

  • 显示加载屏幕
  • 绕过表达式
  • 默认已验证为true

我更喜欢的解决方案(我已经这样做了很多次):

  • 创建一个名为StartupScreen
  • 的自己的屏幕
  • 在其中执行所有与登录相关的操作
  • 在其中显示ActivityIndicator

我的例子:

const StartupScreen = () => {

    const dispatch = useDispatch()

    useEffect(() => {
        const tryLogin = async () => {
            const userData = await AsyncStorage.getItem(USER_DATA)

            if (!userData) {
                dispatch(setDidTryAL())
                return
            }

            const parsedUserData = JSON.parse(userData)
            const {user_id, access_token, expires_at} = parsedUserData
            const expirationDate = new Date(expires_at * 1000)

            if (expirationDate <= new Date() || !access_token | !user_id) {
                dispatch(setDidTryAL())
                return
            }

            const userDetails = JSON.parse(await AsyncStorage.getItem(USER_DETAILS))

            dispatch({type: AUTHENTICATE, user_id, access_token, expires_at, userDetails})
        }

        tryLogin()
    }, [dispatch])

    return (
        <View style={styles.screen}>
            <ActivityIndicator size='large' color={Colors.primary}/>
        </View>
    )
}

export default StartupScreen

和我的根导航器(现代方法):

const AppNavigator = () => {
    const isAuthenticated = useSelector(state => !!state.auth.access_token)
    const didTryAutoLogin = useSelector(state => state.auth.didTryAutoLogin)
    
    return (
        <SafeAreaProvider>
            <NavigationContainer>
                { !isAuthenticated && didTryAutoLogin && <LoginAndRegisterNavigator/> }
                { !isAuthenticated && !didTryAutoLogin && <StartupScreen/>}
            </NavigationContainer>
        </SafeAreaProvider>
    )
}
export default AppNavigator

对我来说,我甚至无法看到加载屏幕,因为登录进程工作得太快了。此外,屏幕的背景颜色应该与用户稍后能够看到的背景颜色相同。他甚至不会注意到装货的东西。

 类似资料:
  • 我有设置路由,意味着通过身份验证,以重定向用户到登录页面,如果未经身份验证。我还设置了来自动脱水我的身份验证状态,以便用户在刷新时保持登录。问题是补液太晚,用户已经被重定向到登录页面 第一个位置更改是对经过身份验证的路由的更改,第二个位置更改是对登录的更改。注意补液是在这些之后。理想情况下,它至少应该在@@init之后?

  • 我试图理解为什么JWT认证是无状态的。在有状态认证中,会有一个会话id。这里有一张JWT的代币,上面有签名。所以身份验证服务器发布JWT令牌,但是我可以说后续请求中JWT令牌的验证是由endpoint服务器(应用服务器)而不是身份验证服务器来完成的吗?我相信这是可能的,因为JWT是用截止日期(还有一些其他信息)签名的,并且认证服务器的公共证书对所有endpoint服务器都是可用的。 因此,认证服务

  • 我是Apache Shiro的初学者。我一直在跟踪文档和许多其他教程,博客等,但我就是无法使身份验证工作。当我尝试使用有效的用户名和密码登录时,总是会引发。我正在使用DynamoDB作为存储用户凭据的自定义领域,但我真的不认为这有什么关系。显然,我存储和/或执行凭据匹配的方式是不正确的。以下是我的设置:

  • 一切工作都很正常,只是随机/偶尔地,尽管用户登录了,会话超时发生,系统注销了用户,尽管令牌有7天的有效期。 所以我决定尝试使系统没有任何会话而无状态。为此,我使用了以下命令: 根据禁用主题状态会话存储 然而,现在我根本无法登录。我得到了 我还没有找到任何完整的会话少四郎的例子。对我的代码有什么建议让它工作吗??我一定是错过了什么,但我不知道是什么。 为什么禁用会话后MyRealm无法从Userna

  • 问题内容: 我试图让我的自定义Java应用程序使用我们的Active Directory服务器进行身份验证,但由于某种原因我无法使其正常工作。谁能看到为什么呢?这是我的方法如下: 结果: 问题答案: 你尝试过这种方式吗? 也更换 与

  • 我正在开发一个Web应用程序 然而,我在尝试允许用户通过注册链接注册时遇到了一个问题。如果用户未经身份验证,则无法访问注册表的链接(“showRegistrationForm”) 有人能洞察为什么会发生这种情况吗?我在下面包含了我的安全配置中的代码片段