跳至内容

使用访问令牌进行移动身份验证

访问令牌可用于对使用您 API 的移动应用程序进行身份验证。这与您使用 API 的第三方用户的工作方式类似,但颁发令牌的方式略有不同。

颁发令牌

通常,移动应用程序会从其登录屏幕发出请求,传入用于身份验证的凭据。经过身份验证后,您将在响应中返回原始令牌,该令牌将保存在设备上以用于后续 API 调用。

首先创建一个路由,该路由将处理移动设备上登录屏幕的请求。设备名称可以是任意字符串,但通常用于标识发出请求的设备,例如“John 的 iPhone 13”。

// Routes.php
$routes->post('auth/token', '\App\Controllers\Auth\LoginController::mobileLogin');
<?php

// app/Controllers/Auth/LoginController.php

namespace App\Controllers\Auth;

use App\Controllers\BaseController;

class LoginController extends BaseController
{
    public function mobileLogin()
    {
        // Validate credentials
        $rules = setting('Validation.login') ?? [
            'email' => config('Auth')->emailValidationRules,
            'password' => [
                'label' => 'Auth.password',
                'rules' => 'required',
            ],
            'device_name' => [
                'label' => 'Device Name',
                'rules' => 'required|string',
            ],
        ];

        if (! $this->validateData($this->request->getPost(), $rules, [], config('Auth')->DBGroup)) {
            return $this->response
                ->setJSON(['errors' => $this->validator->getErrors()])
                ->setStatusCode(401);
        }

        // Get the credentials for login
        $credentials             = $this->request->getPost(setting('Auth.validFields'));
        $credentials             = array_filter($credentials);
        $credentials['password'] = $this->request->getPost('password');

        // Attempt to login
        $result = auth()->attempt($credentials);
        if (! $result->isOK()) {
            return $this->response
                ->setJSON(['error' => $result->reason()])
                ->setStatusCode(401);
        }

        // Generate token and return to client
        $token = auth()->user()->generateAccessToken(service('request')->getVar('device_name'));

        return $this->response
            ->setJSON(['token' => $token->raw_token]);
    }
}

在向 API 发出所有未来请求时,移动客户端应在 Authorization 标头中以 Bearer 令牌的形式返回原始令牌。

注意

默认情况下,$authenticatorHeader['tokens'] 设置为 Authorization。您可以在 app/Config/AuthToken.php 配置文件中设置 $authenticatorHeader['tokens'] 值来更改标头名称。例如,如果 $authenticatorHeader['tokens'] 设置为 PersonalAccessCodes,则移动客户端应在 PersonalAccessCodes 标头中以 Bearer 令牌的形式返回原始令牌。