前提・実現したいこと
バックエンドをDjango, フロントをReactで実装しています。
ログイン成功時、リダイレクトを行い、/dashboard
に移りたいのですが出来ません。
発生している問題・エラーメッセージ
エラーは発生しておらず、バックエンドからは200が返ってくることを確認しています。
該当のソースコード
React.js
1 2import React, { useContext, useState } from "react"; 3import { 4 BoldLink, 5 BoxContainer, 6 FormContainer, 7 Input, 8 MutedLink, 9 SubmitButton, 10 FieldContainer, 11 FieldError, 12 FormError 13} from "../common"; 14import { useFormik } from "formik"; 15import * as yup from "yup"; 16import axios from "axios"; 17import { withRouter } from "react-router-dom"; // new import 18import { connect } from "react-redux"; // new import 19import PropTypes from "prop-types"; // new import 20import { Link } from "react-router-dom"; 21import { Container, Button, Row, Col, Form } from "react-bootstrap"; 22 23import {setAxiosAuthToken, toastOnError} from "../../utils/Utils"; 24import {getCurrentUser, setToken, unsetCurrentUser} from "./LoginActions"; // new import 25 26const validationSchema = yup.object( 27 {userName: yup.string().required(), 28 password: yup.string().required()} 29) 30 31const login = (userData, redirectTo) => dispatch => { 32 axios 33 .post("/api/v1/token/login/", userData) 34 .then(response => { 35 const { auth_token } = response.data; 36 setAxiosAuthToken(auth_token); 37 dispatch(setToken(auth_token)); 38 dispatch(getCurrentUser(redirectTo)); // ここでログイン成功時、リダイレクトさせたい。 39 }) 40 .catch(error => { 41 dispatch(unsetCurrentUser()); 42 toastOnError(error); 43 }); 44}; 45 46// aaaaa@ggggggg.com (test account) 47const Login = (props) => { 48 const [error, setError] = useState(null); 49 50 const onSubmit = async (values) => { 51 const postedData = { 52 username: values.userName, 53 // email: values.email, 54 password: values.password 55 } 56 setError(null); 57 console.log("valuesForLogin", postedData) 58 login(values, "/dashboard") // このログイン関数が何も行ってくれない。(ここでリダイレクトさせたい。) 59 60 const response = await axios.post("/api/v1/token/login/", postedData).catch((err) => { 61 if (err && err.response) { 62 setError(err.response.data.message); 63 } 64 } 65 66 ); 67 if (response) { 68 console.log("Auth success"); 69 console.log(response); 70 const { auth_token } = response.data; // get auth_token 71 setAxiosAuthToken(auth_token); 72 } 73 74 75 } 76 const formik = useFormik({initialValues: {userName: "", password: ""}, validateOnBlur: true, onSubmit, validationSchema: validationSchema }); 77 return ( 78 <BoxContainer> 79 <h1>Login</h1> 80 {error && <FormError>{error ? error: ""}</FormError>} 81 <FormContainer onSubmit={formik.handleSubmit}> 82 <FieldContainer> 83 <Input name="userName" placeholder="Username" value={formik.values.userName} onChange={formik.handleChange} onBlur={formik.handleBlur}/> 84 {<FieldError>{formik.touched.userName && formik.errors.userName ? formik.errors.userName : ""}</FieldError>} 85 </FieldContainer> 86 87 88 <FieldContainer> 89 <Input name="password" type="password" placeholder="Password" value={formik.values.password} onChange={formik.handleChange} onBlur={formik.handleBlur}/> 90 {<FieldError>{formik.touched.password && formik.errors.password ? formik.errors.password : ""}</FieldError>} 91 92 </FieldContainer> 93 <MutedLink href="#">Forget your password?</MutedLink> 94 <SubmitButton type="submit" 95 disabled={!formik.isValid} 96 >Signin</SubmitButton> 97 </FormContainer> 98 99 100 </BoxContainer> 101 ); 102} 103 104export default Login; 105
getCurrentUser
の部分は以下になります。
React.js
1export const getCurrentUser = redirectTo => dispatch => { 2 axios 3 .get("/api/v1/users/me/") 4 .then(response => { 5 const user = { 6 username: response.data.username, 7 // email: response.data.email 8 }; 9 dispatch(setCurrentUser(user, redirectTo)); 10 }) 11 .catch(error => { 12 dispatch(unsetCurrentUser()); 13 toastOnError(error); 14 }); 15}; 16 17export const setCurrentUser = (user, redirectTo) => dispatch => { 18 localStorage.setItem("user", JSON.stringify(user)); 19 dispatch({ 20 type: SET_CURRENT_USER, 21 payload: user 22 }); 23 24 console.log("set user" + redirectTo); 25 if (redirectTo !== "") { 26 dispatch(push(redirectTo)); 27 } 28};
試したこと
バックエンド側で200が返却されることは確認しています。
ログイン画面
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/28 04:27