Как преобразовать проект Laravel в API Laravel? - PullRequest
0 голосов
/ 02 января 2019

У меня есть полностью готовый проект, сделанный с задним концом Laravel и передним концом реакции.Приложение реагирования обернуто в код Laravel и будет доступно только после входа в систему и некоторых выборов, которые все выполняются в laravel с его представлениями.Я хочу сделать приложение реагировать как отдельное приложение и превратить код laravel в API, который подается с сервера через.URL-адрес, такой, что приложение реагирует, отправляя запросы к API-интерфейсу laravel.

Итак, моя первая проблема заключается в следующем: существует ли способ реализовать API для моего кода laravel, который имитирует мою уже существующую реализацию входа в систему??

Поскольку мой вопрос довольно широкий, я не был уверен, какой код предоставить для этого вопроса.Код соответствует шаблону проектирования MVC, поэтому не стесняйтесь спрашивать некоторые части кода.

В качестве небольшого вопроса не по теме (не читайте это, если вы просто хотите помочь с вещами laravel)Причина, по которой я хочу отделить внутреннюю часть laravel и приложение переднего плана реагирования, заключается в том, чтобы обернуть приложение реагирования в электронное, чтобы сделать его автономным приложением с использованием внутреннего интерфейса laravel.Является ли это разумным подходом?

Редактировать: я обнаружил, что суть проблемы заключается в том, как выполнить «стиль API» входа в систему по сравнению с формой входа, которую предоставляет laravel.Поэтому я думаю, что мне нужно реализовать вход в систему с помощью laravel Passport, чтобы получить пользователя с учетными данными, совпадающими с данными, полученными при входе через форму входа в систему 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');
}
}

Middleware (из 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,
];

Edit-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');

Edit 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, используя функцию login для получения токена доступа (и я получаю токен доступа), и мой 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. Как видите, яне уверен что поставить куда :).Если вам нужно больше кода, не стесняйтесь спрашивать:).

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я думаю, что было бы полезно перейти на Laravel 5 и выше с той же схемой и логикой, у них теперь есть новый файл маршрута с именем api.php, более того, все ответы будут преобразованы в объект JSON для использования внешним интерфейсом.

Если вы не хотите мигрировать в Laravel, просто преобразуйте все ответы в объекты JSON

0 голосов
/ 02 января 2019

вам нужно конвертировать ваши маршруты / Интернет в Routes / api

, а затем вы можете выбрать между laravel passport API или jwt API для использования в вашем приложении

(если вы выбрали jwt, то выпотребуется создать папку в контроллере, назвать ее API и добавить API \ в вашем примере Routes / api: Route: post :: ('/ example', 'API \ yourcontroller @ yourfunction');)

и для соединения с API, вам нужно отправить запрос к вам

www.yourdomain.com / api / ваш маршрут API

это все надежда, что это будет работать для вас

edit:

это намного проще, чем вы думаете, пока вы работаете с API, вам не нужен "контроллер входа в систему (из App / http / controllers / auth)", который вам понадобится (после добавленияПаспорт Laravel для вашего проекта вы можете найти в документации documentmentaion ), чтобы создать один контроллер для аутентификации

пример logincontroller:

 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);
}

вам нужно кхТеперь, когда вы входите в систему с помощью 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 в корень для получения пользовательских данных

Edite 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');

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...