Write the Code. Change the World.

3月 04

后台的接口授权问题已经解决。现在做移动端的接口。移动端接口路由写在 routes/api.php 中。测试用 postman 就可以。不用去做 ui 界面。

定义一个登录接口和获取用户信息接口

移动端一般都是使用微信授权登录或手机号登录,这样比较贴近场景和方便。为了测试,这里使用邮箱和密码登录。

routes/api.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\UserController;

// 登录
Route::post('login', [UserController::class, 'login'])->name('api.login');

Route::group([
    'middleware' => ['auth:sanctum'],
], function () {
    Route::get('userinfo', [UserController::class, 'getUserInfo'])->name('api.getUserInfo');
});

当前,UserController.php 文件还没有,我们创建一个。

php artisan make:controller Api/UserController

里边加入相应的逻辑。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Http\Requests\Admin\LoginRequest;
use App\Models\User;

class UserController extends Controller
{
    public function login(LoginRequest $request)
    {
        $data = $request->only(['email', 'password']);

        if (!Auth::validate($data)) {
            return response()->json(['message' => '账号密码错误'], 403);
        }

        $user = User::where('email', $data['email'])->first();

        $user['token'] = $user->createToken('auth')->plainTextToken;

        return response()->json($user);
    }

    public function getUserInfo(Request $request)
    {
        $user = $request->user();

        return response()->json($user);
    }
}

这里依然使用了 LoginRequest 来进行字段的验证。

下边,打开 postman 来进行验证验证。

故意写错密码。返回了错误提示,http 状态码是指定的 403。故意不写 401,401 有它独有的作用。然后修改为正确密码再测试。


这次,返回了正常的数据,也返回了 token。下一步,就通过 token 来获取用户的信息。

这个是在 header 中没有加入 token,返回的结果。这里存在两个问题,第一不能返回正确的结果,第二这里返回的是 html。我们接口通常需要返回的是 json 。给个 html 算啥。这个有两个解决方法,第一就是在发起请求的时候,在 header 中指定 accept 为 application/json 就好。这样框架会知道接口想要什么样的数据。测试如下。

还有一种方式,服务端在数据请求之前主动在header加上 accept。因为很 明确这里是做接口的,那我就干脆直接加上。这个场景,我们新建一个前置中间件就可以完成。

php artisan make:middleware AcceptHeader

# 主动加入 accept

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class AcceptHeader
{
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');

        return $next($request);
    }
}

然后,在 $middlewareGroups 的 api 的第一个位置,配置上这个中间件就可以。

App/Http/Kernel.php

        'api' => [
            \App\Http\Middleware\AcceptHeader::class,
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

再来试试,这样就可以了。

最后,我们加上正确的 token。就能正常的获取的用户信息了。

到此。一个简单多端授权使用的功能初步完成了。但对于一个完整的项目,这还远远不够。需要去舔砖加瓦,写更多符合场景需要的业务。