Reputation: 2237
I know this question has been asked before here. (Please clink on the link before you vote to close it under the duplicate tag.) But none of the solutions have worked for me.
I can access /
without any errors. But when I try to use a get request to login I get this error:
NotFoundHttpException
in RoutesRequests.php (line 594)
at Application->handleDispatcherResponse(array(0))
in RoutesRequests.php (line 532)
at Application->Laravel\Lumen\Concerns\{closure}()
in RoutesRequests.php (line 781)
at Application->sendThroughPipeline(array(), object(Closure))
in RoutesRequests.php (line 534)
at Application->dispatch(null)
in RoutesRequests.php (line 475)
at Application->run()
in index.php (line 28)
index.php (line 28)
points to $app->run();
Here is my code for the login form page:
<!DOCTYPE html>
<html>
<head>
<title>notes!</title>
<!-- <link rel="stylesheet" type="text/css" href="{{ url('../assets/css/main.css') }}"> -->
<style>
body {
background-color: #ffffff;
}
.banner {
margin: 100px auto;
text-align: center;
vertical-align: middle;
font-family: 'Open Sans', sans-serif;
font-size: 30px;
color: #333333;
}
.loginContainer {
width:30%;
margin: 50px auto;
vertical-align: middle;
background-color: #333333;
border:2px;
border-radius:10px;
}
form {
margin: 0 auto;
padding: 50px;
}
form input {
display: block;
width: 300px;
margin: 0 auto;
margin-top: 5px;
padding: 5px;
font-size: 30px;
}
form button {
display: block;
width: 314px;
margin: 0 auto;
margin-top: 5px;
padding: 5px;
border-radius: 5px;
border: none;
background-color: #3366ff;
color: #ffffff;
font-size: 30px;
}
</style>
<link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">
</head>
<body>
<!-- <div class="navbar">
<ul>
<li>Login</li>
<li>About Me!</li>
</ul>
</div> -->
<div class="banner">
<h1>Welcome to notes!</h1>
<h4>Add notes, to-do lists and more!</h4>
</div>
<div class="loginContainer">
<form class="signin" method="get" action="/login/">
<input type="email" id="inputEmail" placeholder="Email" required="" autofocus="">
<input type="password" id="inputPassword" placeholder="Password" required="">
<button type="submit">Sign in</button>
</form>
</div>
</body>
</html>
Here is the code for routes.php
:
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It is a breeze. Simply tell Lumen the URIs it should respond to
| and give it the Closure to call when that URI is requested.
|
*/
$app->get('/', function () use ($app) {
return view('welcome');
});
$app->get('login/','UsersController@authenticate');
$app->post('todo/','TodoController@store');
$app->get('todo/', 'TodoController@index');
$app->get('todo/{id}/', 'TodoController@show');
$app->put('todo/{id}/', 'TodoController@update');
$app->delete('todo/{id}/', 'TodoController@destroy');
?>
Here is the UsersController.php
file:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
use App\Users;
class UsersController extends Controller
{
public function __construct()
{
// $this->middleware('auth:api');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function authenticate(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required'
]);
$user = Users::where('email', $request->input('email'))->first();
if(Hash::check($request->input('password'), $user->password)){
$apikey = base64_encode(str_random(40));
Users::where('email', $request->input('email'))->update(['api_key' => "$apikey"]);;
return response()->json(['status' => 'success','api_key' => $apikey]);
}else{
return response()->json(['status' => 'fail'],401);
}
}
}
?>
Upvotes: 0
Views: 3474
Reputation: 3905
That's because the trailing backslash in your action
attribute but here's some points to consider:
First of all I do not know why you want to use GET request for login form since the credentials you send to the server will appear in the url in the user's browser and this kind of info should be safe especially the Password - another thing why don't you use blade engine to make your views more elegant but it's ok we can use the native php syntax.
to get the correct path to the /login
route we will make use of url.
then we will change the method to post which suits perfect for what we want to achieve : send data to our server without being displayed in the user's browser so our form will look like this:
<form class="signin" method="post" action="<?=url('/login');?>">
<input type="email" id="inputEmail" name="email" placeholder="Email">
<input type="password" id="inputPassword" name="password" placeholder="Password">
</form>
another thing i have added the name attribute which is important when retrieving the form values.
and also we will use post
method in routes/web.php
like so:
$app->post('/login','UsersController@authenticate');
Upvotes: 1
Reputation: 10179
I think you .htaccess
file missing, add .htaccess
file in public directory and assign read permission to apache
:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
Upvotes: -1
Reputation: 383
Route first argument is trimmed with '/'
Fix to form action: /login/ -> /login
<form class="signin" method="get" action="/login">
Upvotes: 3