我使用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;
}
}
您有多个选项
我更喜欢的解决方案(我已经这样做了很多次):
我的例子:
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”) 有人能洞察为什么会发生这种情况吗?我在下面包含了我的安全配置中的代码片段