<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Dingo API和JWT 參考: https://laravel-china.org/articles/5804/laravel54jwtdingoapi-building-restfulapi ## 引入 Dingo API https://github.com/liyu001989/dingo-api-wiki-zh JWT https://github.com/tymondesigns/jwt-auth/wiki/installation 在composer.json中寫 ``` "require": { "php": ">=5.5.9", "laravel/framework": "5.1.*", "dingo/api": "1.0.*@dev", "tymon/jwt-auth": "0.5.*" }, ``` 運行composer update 打開 config/app.php,注冊必要的 service provider 在你的應用 providers 之前。 ``` 'providers' => [ Dingo\Api\Provider\LaravelServiceProvider::class ``` 如果你想在配置文件中改變一些配置,你可以使用下面的 Artisan 命令發布配置文件 `php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"` 任何你就可以看到config文件夾下有api.php 接下來配置JWT config/app.php ```php 'providers' => [ Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class, ``` ```php 'aliases' => [ 'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class, 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class, ``` 然后執行 `php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"` 生成配置文件 然后可以看到config文件夾下面有jwt.php 最后執行 `php artisan jwt:generate` 會生成一個key給我們用 如果用laravel5.5可能遇到個問題 ![](https://box.kancloud.cn/482324b5a1923e96f4db61ceb95bc11b_2368x1371.png) 安裝上面來就可以 在.env文件中為dingo api寫上配置信息,寫4個就可以 ``` API_STANDARDS_TREE=vnd API_PREFIX=api API_VERSION=v1 API_DEBUG=true ``` 在config/api.php中,有auth這個空數組,編輯它 ```php 'auth' => [ 'basic'=>function($app){ return new Dingo\Api\Auth\Provider\Basic($app['auth']); }, 'jwt'=>function($app){ return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']); } ], ``` 在config/jwt.php文件中,有`'secret' => env---` 這就是我們之前生成的key,里面不改功能也能實現 在app\Http\Kernel.php文件中編輯,增加新增的 ```php protected $routeMiddleware = [ 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'jwt.auth'=> \Tymon\JWTAuth\Middleware\GetUserFromToken::class, 'jwt.refresh'=> \Tymon\JWTAuth\Middleware\RefreshToken::class, ]; ``` 這邊環境配置也就完成了 ## 初步使用 先把原來的路由注釋掉,在路由中寫 ```php $api=app('Dingo\Api\Routing\Router'); $api->version('v1',function($api){ //在這里面可以寫我們的路由 $api->group(['namespace'=>'App\Api\Controllers'],function($api){ $api->get('lessons','LessonsController@index'); }); }); ``` 然后在app文件夾下創建Api/Controllers 這2個文件夾 在app/Api/Controllers文件夾下新建BaseController.php和LessonsController.php 編輯BaseController.php 讓每個控制器繼承BaseController就是讓后面控制器能用dingoapi的Helpers ```php namespace App\Api\Controllers; use App\Http\Controllers\Controller; use Dingo\Api\Routing\Helpers; class BaseController extends Controller { //use Dingo\Api\Routing\Helpers; use Helpers; } ``` 編輯LessonsController.php ```php namespace App\Api\Controllers; use App\Lesson; class LessonsController extends BaseController { public function index() { return Lesson::all(); } } ``` 文件編輯好了,我們通過 `php artisan api:routes` 這個命令來查看api路由 ## transform 在Api文件夾下新建一個Transformers文件夾,新建個文件 LessonTransformers.php ~~~ namespace App\Api\Transformers; use App\Models\User; use League\Fractal\TransformerAbstract; class LessonTransformer extends TransformerAbstract { public function transform(User $user) { return [ 'id'=>$user['id'], 'username'=>$user['username'], ]; } } ~~~ 在LessonsController.php中我們這樣寫 ~~~ public function text() { $data=User::all(); return $this->collection($data,new LessonTransformer()); } ~~~ ### 使用JWT 我們在app\Api\Controllers這個文件夾下面新建 `AuthController.php` 編輯這個文件 ```php namespace App\Api\Controllers; use Illuminate\Http\Request; use JWTAuth; use Tymon\JWTAuth\Exceptions\JWTException; class AuthController extends BaseController { //這個方法主要負責返回我們token,有過期時間的,token做為登錄標識 public function authenticate(Request $request) { // grab credentials from the request $credentials = $request->only('email', 'password'); try { // attempt to verify the credentials and create a token for the user if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 401); } } catch (JWTException $e) { // something went wrong whilst attempting to encode the token return response()->json(['error' => 'could_not_create_token'], 500); } // all good so return the token return response()->json(compact('token')); } } ``` 里面方法直接是復制手冊的,然后我們編輯路由 ```php $api=app('Dingo\Api\Routing\Router'); $api->version('v1',function($api){ //在這里面可以寫我們的路由 $api->group(['namespace'=>'App\Api\Controllers'],function($api){ $api->post('user/login','AuthController@authenticate'); $api->get('lessons','LessonsController@index'); }); }); ``` 我們用postman來模擬,在Authorization這個選項中Type選擇 `Basic Auth` 里面寫用戶名和密碼,這樣發送還不行,還要在Body里面寫email和對應的值,以及password和對應的值,發送過去,就可以拿到token 沒有這個token訪問不了JWT保護的東西 在路由中編輯 ```php $api=app('Dingo\Api\Routing\Router'); $api->version('v1',function($api){ //在這里面可以寫我們的路由 $api->group(['namespace'=>'App\Api\Controllers'],function($api){ $api->post('user/login','AuthController@authenticate'); $api->post('user/register','AuthController@register'); //這邊的jwt.auth是對應Kernel.php文件中的 $api->group(['middleware'=>'jwt.auth'],function($api){ //根據token獲取用戶信息,要用戶登錄,根據登錄token才可獲取到 $api->get('user/me','AuthController@AuthenticatedUser'); //這樣這個路由就受到了jwt.auth保護,如果沒有token是不行的 $api->get('lessons','LessonsController@index'); }); }); }); ``` 根據token獲取用戶信息(要用戶登錄,根據登錄token才可獲取到) 下面代碼注意命令空間,代碼直接復制手冊 ```php public function getAuthenticatedUser() { try { if (! $user = JWTAuth::parseToken()->authenticate()) { return response()->json(['user_not_found'], 404); } //use Tymon\JWTAuth\Exceptions\TokenExpiredException; } catch (TokenExpiredException $e) { return response()->json(['token_expired'], $e->getStatusCode()); //use Tymon\JWTAuth\Exceptions\TokenInvalidException; } catch (TokenInvalidException $e) { return response()->json(['token_invalid'], $e->getStatusCode()); //use Tymon\JWTAuth\Exceptions\JWTException; } catch (JWTException $e) { return response()->json(['token_absent'], $e->getStatusCode()); } // the token is valid and we have found the user via the sub claim return response()->json(compact('user')); } ``` 然后訪問這個api,加上?token= 問題: 如果我們數據庫字段不是email和password,是user_email和user_password,我們該怎么辦 編輯AuthController.php這個文件中authenticate這個方法 ```php // 注釋這一行 // $credentials = $request->only('email', 'password'); $credentials =[ //get獲取的 'user_email'=>$request->get('user_email'), 'password'=>$request->get('user_password'), ]; ``` 然后在User.php這個模型類中新增個方法 ```php public function getAuthPassword(){ //指向數據庫字段 return $this->user_password; } ``` postman測試token時候,email和password換為user_email和user_password ## oAuth(廢棄) ### 配置 github相關資料: https://github.com/xiaosier/libweibo https://github.com/liyu001989/dingo-api-wiki-zh/blob/master/Authentication.md 在composer.json中添加`"lucadegasperi/oauth2-server-laravel": "5.0.*"` 運行 `composer update` 在config/app.php中providers數組中添加 `LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class,` `LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class,` 在aliases數組中添加 `'Authorizer'=>LucaDegasperi\OAuth2Server\Facades\Authorizer::class,` 在app\Http\Kenel.php中middleware數組中添加`\LucaDegasperi\OAuth2Server\Middleware\OAuthExceptionHandlerMiddleware::class,` 在routeMiddleware數組中添加 ```php 'oauth'=>\LucaDegasperi\OAuth2Server\Middleware\OAuthMiddleware::class, 'oauth-user'=>\LucaDegasperi\OAuth2Server\Middleware\OAuthUserOwnerMiddleware::class, 'oauth-client'=>\LucaDegasperi\OAuth2Server\Middleware\OAuthClientOwnerMiddleware::class, 'check-authorization-params'=>\LucaDegasperi\OAuth2Server\Middleware\CheckAuthCodeRequestMiddleware::class, ``` 運行 `php artisan vendor:publish` 生成配置文件oauth2.php,運行 `php artisan migrate` 生成表 在config/api.php中編輯,如果原來這數組有東西就改了 ```php 'auth' => [ 'jwt'=>'Dingo\Api\Auth\Provider\JWT' ], ``` 在config/oauth2.php中編輯 ```php 'grant_types' => [ 'authorization_code'=>[ 'class'=>'\League\OAuth2\Server\Grant\AuthCodeGrant', 'access_token_ttl'=>3600, 'auth_token_ttl'=>3600 ] ], ``` ### 流程
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看