【问题标题】:laravel restful api not returning access_tokenlaravel restful api 不返回 access_token
【发布时间】:2021-08-24 13:40:16
【问题描述】:

我在 laravel 8 中构建了一个宁静的 api,并通过护照在我想添加授权之前运行良好。 我在网上找到了几个如何注册和登录的示例(看起来都一样),但是当我注册用户时,我得到的东西看起来不像他们在示例中显示的 access_token。我总是得到这样的回报:

{
    "user": {
        "id": 1,
        "name": "Georg Stein",
        "email": "xxx@test.de",
        "email_verified_at": null,
        "created_at": "2021-08-24T06:40:51.000000Z",
        "updated_at": "2021-08-24T06:40:51.000000Z"
    },
    "access_token": {
        "name": "authToken 2021-08-24 13:27:58",
        "abilities": [
            "*"
        ],
        "tokenable_id": 1,
        "tokenable_type": "App\\Models\\User",
        "updated_at": "2021-08-24T13:27:58.000000Z",
        "created_at": "2021-08-24T13:27:58.000000Z",
        "id": 21
    }
}    

我哪里错了?

乔治

【问题讨论】:

  • 我们需要知道config.php(守卫部分)、User 模型、AuthServiceProvider(至少)。如果它有效,你改变了什么?对于 API 响应,除了返回用户之外,我们无法告诉您更多信息(如果用户错误,我不会告诉您)
  • 从您注册用户的位置共享您的 API 控制器,并确保您有护照密钥 & 在 config/auth.php 我们有: 'api' => [ 'driver' => 'passport', '提供者' => '用户', ],
  • 我现在使用 laravel 7.3 版和护照 9.4 构建相同的版本,并且令牌出现在响应中
  • 顺便说一句,我在php 8下使用了laravel 8.56.0和passport 10.1.3
  • 您是否发现了问题,或者这是预期的行为?数据库中保存了一个token,如上图,但是怎么处理呢?

标签: laravel token


【解决方案1】:

这里需要的文件内容: auth.php:

...'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    "api" => [
        "driver" => "passport",
        "provider" => "users",
        //"hash" => false,
    ]
],...

User.php 模型

...
namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
...

AuthServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Models\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();        
        Passport::routes();
    }
}

AuthController:

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller {
    public function register(Request $request) {
        error_log("REGISTER");
        $validatedData = $request->validate([
           "name" => "required|max:55",
            "email" => "email|required|unique:users",
            "password" => "required|confirmed"
        ]);
        error_log("REGISTER - validated");
        $validatedData["password"] = bcrypt($request->password);
        
        $user = User::create($validatedData);
        
        $accessToken = $user->createToken("authToken")->accessToken;
        error_log("REGISTER CALLED Token: ".$accessToken);
        return response(["message" => "you are now registered", "user" => $user, "access_token" => $accessToken], 201);
    }
    
    public function login (Request $request) {
        error_log("LOGIN");
        $loginData = $request->validate([
           "email" => "email|required",
            "password" => "required"
        ]);
        
        if (!auth()->attempt($loginData)) {
            return response(["message" => "This user does not exist, check your details"], 400);
        }
        error_log("LOGIN - User: ". json_encode(auth()->user()));
        
        $accessToken = auth()->user()->createToken(auth()->user()->email." authToken ".now())->accessToken;
        error_log("LOGIN - Token: ".$accessToken);
        
        return response(["user" => auth()->user(), "access_token" => $accessToken]);
    }
}

路由/api.php:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\AuthController;
use App\Http\Controllers\API\WerkstattController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

//Route::post("register", [\App\Http\Controllers\API\AuthController::class]);
Route::post("register", "\App\Http\Controllers\API\AuthController@register");
//Route::post("login", [\App\Http\Controllers\API\AuthController::class, "login"]);
Route::post("login", "\App\Http\Controllers\API\AuthController@login");

Route::apiResource("werkstatt", WerkstattController::class)->middleware("auth:api");

希望我没有错过要发布的重要内容 乔治

【讨论】:

    【解决方案2】:

    User.php 从改变

    使用Laravel\Sanctum\HasApiTokens;

    使用Laravel\Passport\HasApiTokens;

    然后再次'php artisan serve'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多