I'm testing this in Android Studio right now. This is my Go code that I'm trying to use in my Flutter frontend:
func Login(c *gin.Context) {
// Get email and password off of req body
var body struct {
Email string
Password string
}
if c.Bind(&body) != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Failed to read body",
})
return
}
var user models.User
if user.ID == 0 {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid email and/or password",
})
return
}
// Lookup user by email, including records where deleted_at is NULL
if err := initializers.DB.Where("email = ? AND deleted_at IS NULL", body.Email).First(&user).Error; err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid email and/or password",
})
return
}
// Compare passwords
err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(body.Password))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid email and/or password",
})
return
}
// Generate JWT Token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": user.ID,
"exp": time.Now().Add(time.Hour * 24 * 30).Unix(),
})
tokenString, err := token.SignedString([]byte(os.Getenv("SECRET")))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Failed to create token",
})
return
}
// Send back
c.SetSameSite(http.SameSiteLaxMode)
c.SetCookie("AuthZ", tokenString, 3600*24*30, "", "", false, true)
c.JSON(http.StatusOK, gin.H{})
}
//main,go
r.POST("/login", controllers.Login)
I keep getting a 400 error code and I'm trying to parse out why. Here's how I'm sending the request:
void postLogin(String email, String password) async {
Response response;
response = await _dio.post('$baseUrl/login', data: {
'email': email,
'password': password,
});
}
...
try {
postLogin(
emailController.text, passwordController.text);
print('Login successful');
} catch (error) {
print('Login failed: $error');
// Print Dio error message
if (error is DioError) {
print('Dio error message: ${error.message}');
}
setState(() {
errorText =
'Login failed. Please check your credentials.';
});
} finally {
setState(() {
isLoading = false;
});
}
The API works in Postman and through other testing methods, but it doesn't work in Android Studio, at least not with the way I'm using Dio.
Thank you for any help.
This looks like your problem:
var user models.User
if user.ID == 0 {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid email and/or password",
})
return
}
Assuming the ID
on a models.User
is just an int
, the default is always zero! You probably want to load the user, e.g. from the DB, before checking the ID
.