我有一个完全完成的项目,由Laravel后端和反应前端组成。反应应用程序包装在Laravel代码中,只有在登录和一些选择后才可用,这些都是在laravel中完成的,并带有它的视图。我想把反应应用程序做成一个独立的应用程序,并把laravel代码做成一个api,从服务器通过。一个url,这样反应应用程序将通过向laravel api发出请求来工作。
所以我的第一个问题是:有没有一种方法可以在我的laravel代码中实现API,以模仿我现有的登录实现?
由于我的问题相当广泛,我不确定该为这个问题提供什么代码。代码遵循MVC设计模式,因此请随时询问代码的某些部分。
作为一个稍微偏离主题的问题(如果您只是想帮助 laravel 的东西,请不要阅读这篇文章):我想将 laravel 后端和 react 前端应用程序解耦的原因是将 react 应用程序包装在 electron 中,使其成为离线应用程序,使用 laravel 后端。这是一个合理的方法吗?
编辑:我发现问题的症结是如何执行登录“API样式”而不是Laravel提供的登录表单。所以我认为我需要使用 laravel 护照实现登录,检索具有与通过 laravel 登录表单登录的用户匹配的用户。但是 laravel 登录表单中的逻辑对我来说很难看透,所以我可以使用帮助之手来做到这一点。
下面是我的登录控制器的代码,以及相关的中间件。再次,告诉你是否需要更多的代码。
登录控制器(来自App/http/controllers/auth):
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|---------------------------------------------------------------------
| Login Controller
|------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
中间件(来自 App/http/Kernel.php):
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware \AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
第2版:
以下是我的web.php路线代码:
<?php
/*
|---------------------------------------------------------------
| Web Routes
|----------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Auth::routes();
Route::get('/', 'HomeController@index')->name('home');
Route::get('/home', 'HomeController@index')->name('home');
Route::get('/setlocale/{locale}', function (Request $request, $locale) {
if (in_array($locale, \Config::get('app.locales'))) {
session()->put('locale', $locale);
}
return redirect()->back();
});
Route::get('/profile', 'UserController@show')->name('profile');
Route::patch('/profile', 'UserController@update')->name('users.update');
Route::get('/scan', 'HomeController@index')->name('scan.index');
Route::get('/scan/new', 'ScanController@new')->name('scan.new');
Route::get('/scan/{id}', 'ScanController@show')->name('scan.show');
Route::post('/scan', 'ScanController@create')->name('scan.create');
Route::patch('/scan/{id}', 'ScanController@update')->name('scan.update');
Route::delete('/scan/{id}', 'ScanController@destroy')->name('scan.destroy');
// save SCAN JSON
Route::post('/scan/{id}/save', 'ScanController@save')->name('scan.save');
编辑3:
首先,当我创建访问令牌时,存储在 /oauth/personal-access-tokens中的内容如下所示:
0:
client:
created_at: "2019-01-04 13:00:48"
id: 3
name: "SCAN Personal Access Client"
password_client: false
personal_access_client: true
redirect: "http://localhost"
revoked: false
updated_at: "2019-01-04 13:00:48"
user_id: null
__proto__: Object
client_id: 3
created_at: "2019-01-15 13:52:22"
expires_at: "2020-01-15 13:52:22"
id: "0321b2d622bd7267273225a64cf6f1723cc74b86076831432fb5af4885051c6776bb8ea77c0d7407"
name: "MyApp"
revoked: false
scopes: []
updated_at: "2019-01-15 13:52:22"
user_id: 1
__proto__: Object
在13:00:48创建的第一个客户端中,uder_id为空。有问题吗?
其次,下面是我如何尝试使用axios发出请求,使用函数登录来获取访问令牌(我确实获得了访问令牌),并且我的API运行在localhost:4321
login = async () => {
return axios.post('http://localhost:4321/api/login', {
grant_type: 'password',
client_id: 5,
client_secret: 'd3zuZL6KbBI4DOq4Z7NQkP1ezrAj5GMjgo39',
email: 'my mail, used to login',
password: 'my password',
scope: '',
})
}
async componentDidMount() {
const accessTokenData = await this.login();
var config = {
headers: {
Authorization: "bearer " + accessToken
},
grant_type: 'password',
client_id: 'PassGrantClient',
client_secret: 'd3zuZL6KbBI4zsDOq4Z7NQkP1ezrAj5GMjgo39',
scope: '',
};
axios.post(
'http://localhost:4321/api/getInterview',
{},
config
).then((response) => {
console.log(response)
})
}
其中getInterview路径指向该函数
public function getInterview()
{
$user = Auth::user();
return response()->json($user);
}
它返回401。正如你所看到的,我不知道该把什么放在哪里:)。如果您需要更多代码,请随时询问:)。
我认为使用相同的模式和逻辑迁移到Laravel 5及以上版本会很有帮助,他们现在有了一个名为api的新路由文件。php,此外,所有响应都将转换为JSON对象供前端使用。
如果您不想迁移到 Laravel,只需将所有响应转换为 JSON 对象即可
您需要将您的路线/网络转换为路线/API
然后,您可以在laravel passport API或jwt API之间进行选择,以便在应用程序中使用
(如果您选择jwt,则需要在控制器中创建一个文件夹并将其命名为API并在Routes/api示例中添加API\:路由:发布::('/示例','API\yourcontroller@yourfunction');)
对于与api的连接反应,您需要向您发送请求
www.yourdomain。com/api/your-api路由
这是所有希望这将为你工作
编辑:
这比你想象的要容易得多,当你使用API的时候,你不需要“登录控制器(来自App/http/controllers/auth)”你需要(在你的项目中添加了laravel passport之后,你可以在文档中找到如何创建你的一个控制器来进行认证
示例登录控制器:
public function login(){
if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')-> accessToken;
return response()->json(['success' => $success],200);
}
else{
return response()->json(['error'=>'Unauthorised'], 401);
}
}
对于注册,您可以使用
public function register(Request $request){
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required',
'c_password' => 'required|same:password',
]);
if ($validator->fails()) {
return response()->json(['error'=>$validator->errors()], 401);
}
$input = $request->all();
$input['password'] = bcrypt($input['password']);
$user = User::create($input);
$success['token'] = $user->createToken('MyApp')-> accessToken;
$success['name'] = $user->name;
return response()->json(['success'=>$success], $this-> successStatus);
}
如果您想获取用户数据,那么需要使用passportapi登录,该api将为您提供accsses_token而不是用户数据
像这样在api中创建路由
Route::group(['middleware' => 'auth:api'], function(){
Route::post('details', 'API\LoginController@details');
}
和您的控制器添加该功能
public function details()
{
$user = Auth::user();
return response()->json(['success' => $user], 200);
}
然后将accsses_token发送到根以获取用户数据
编辑 2 :
如果您想让一个路由只在成功登录后工作,那么您需要用中间件auth:api来保护路由器。示例:
Route::group(['middleware' => 'auth:api'], function(){
Route::post('test', 'API\testController@test');
Route::get('test2', 'API\testController@test2');
Route::post('test3', 'API\testController@test3');
}
问题内容: 有人可以告诉我如何将我的Java程序代码导入Eclipse吗?因为我有点想导入它。我通常使用Java博士,但是我想开始使用Eclipse,因为我觉得它更专业并且我喜欢它的“感觉”?那么有人可以向我解释如何去做吗? 如果您需要任何东西,请问:D 问题答案: 为了将您的代码导入Eclipse: 确保所有代码都在一个文件夹(例如/ project)下 在Eclipse中,使用File-> N
我试图使用Eclipse的从maven开始。但如果我尝试将现有项目更改为Maven项目(),结果是: null 问题可能出在哪里? 更新(生成的pom.xml):
我有一个用Java编写的gradle项目,想把整个事情变成一个scala项目(仍然是gradle)。要做到这一点,需要采取哪些步骤? 我开始在scala中定义main方法,似乎Intellij不知道我要做什么。 到目前为止我所做的: > 在build.gradle中应用插件:“scala”--> 在build.gradle中编译'org.scala-lang:scala-library:2.10.
问题内容: 我已经使用eclipse中的 m2e插件* 将 Java Web项目 转换为 Maven项目 。现在,我需要将其转换回Java Web项目。现在,如何将其更改回Java Web项目。 * 问题答案: 请尝试以下操作: 在Maven项目上打开上下文菜单 选择“ Maven”->“禁用Maven自然” 希望能有所帮助。
所以发生的事情是,我从这个项目的一开始就开始研究智能IDEA。由于提交要求,我不得不将项目转换为Eclipse兼容形式。所以我把它转换成了日食计划。在那之后,我注意到我不能像以前那样真正地做这个项目。这是我在将我的项目转换为Eclipse兼容后看到的。我想撤消它。但我不知道该怎么做。
我在Eclipse IDE中编写了JavaFx项目,它工作正常。 一旦我把它转换成Maven项目,我的FMXL文件就停止打开了。但是,如果我创建新的FXML文件并将它们放在相同的文件夹中,一切都会正常工作。 有没有办法在不重新创建所有FXML文件的情况下运行我的Maven项目? 我已经尝试过在代码中更改FXML文件的路径,将FXML移到src/main/resources包,或者简单地将代码从旧的