按照 Laravel 上有关 API 路由Passport 身份验证的文档,我目前在使用 axois 从 api 获取数据时遇到一些问题。
到目前为止,我已经通过 Composer 安装了 Passport,添加了 hasApiTokens 特征,在 AuthServiceProvider 的 boot 方法中添加了对 Passport::routes 的调用,并将 api 身份验证防护的驱动程序选项设置为“passport”。
由于我希望用户在登录后通过 Javascript 从基于 Vue 的 SPA 使用 API,因此我已将 CreateFreshApiToken 添加到 Web 中间件组。
当我运行以下代码片段来测试所有内容时,就会出现问题:
axios.get('api/users').then( function(response) { console.log(response.data); });
Run Code Online (Sandbox Code Playgroud)
结果是“无法加载资源:服务器响应状态为 401(未经授权) ”响应。
我已经检查了使用 axois 发送的请求的标头,并且标头包含两者
Cookie:laravel_token=eyJpdiI6ImJ5RG1KRk...
和
X-XSRF-令牌:eyJpdiI6IlVRRHhxSXp2VDVy...
我做错了什么吗?
我正在使用 Laravel Passport 来保护我的 REST API。目前,我使用 创建个人访问令牌$user->createToken('APP_NAME')->accessToken,但这些令牌没有过期日期。所以我想创建一个密码访问令牌。我注意到,这些是由该AccessTokenController.issueToken()方法生成的。
但我找不到任何关于如何称呼它的信息。
我目前的解决方案
$input = $request->all();
$user = User::where('email', $input['email'])->first();
if ($user) {
if ($input['password'] == $user->password) {
$token = $user->createToken($this->app_name)->accessToken;
return [
'token' => $token,
'user' => $user
];
} else
return new ResponseGeneratorError('Password mismatch', 400);
} else
return new ResponseGeneratorError('User does not exist', 400);
Run Code Online (Sandbox Code Playgroud) Laravel Passport Auth Stuck when run on self server and client in same project for password based token authentication
LoginController
public function authenticaterrr(Request $request)
{
$http = new Client();
try{
//dd("Hello");
$response = $http->post(url('oauth/token'), [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
// 'username' => $request->get('username'),
// 'password' => $request->get('password'),
'username' => 'xxxxxx@xxxxx.com',
'password' => 'xxxxx',
'scope' => '*',
],
]);
// $apiResponse = json_decode((string) $response->getBody(), true);
// dd($apiResponse);
$apiResponse = json_decode((string) $response->getBody(), true);
dd($apiResponse); …Run Code Online (Sandbox Code Playgroud) 我在 routes/api.php 上配置的 Laravel 应用程序路由是。
<?php
use Illuminate\Http\Request;
Route::post('see_all_product', 'API\ProductController@see_all_product');
?>
Run Code Online (Sandbox Code Playgroud)
问题是我想发送产品列表,但如果用户通过身份验证,则发送产品收藏标志 1,如果未通过身份验证,则发送返回收藏夹 0
但是两种情况都发送带有最喜欢标志的产品列表。
如果我使用我的用户 ID 和密码登录并发送对see_all_product 的请求,那么我将获得空白用户。
$user = $request->user();
Run Code Online (Sandbox Code Playgroud)
但是,如果我设置如下路线,我将获取用户详细信息。
<?php
use Illuminate\Http\Request;
Route::group(['middleware' => 'auth:api'], function(){
Route::post('see_all_product', 'API\ProductController@see_all_product');
});
?>
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果在具有相同 api 的标头中设置了授权,我如何获取详细信息。
<?php
use Illuminate\Http\Request;
Route::post('see_all_product', 'API\ProductController@see_all_product');
?>
Run Code Online (Sandbox Code Playgroud)
我的see_all_product功能
public function see_all_product(Request $request){
try {
$user = $request->user();
} catch (Exception $ex) {
Log::error($ex);
}
}
Run Code Online (Sandbox Code Playgroud)
API 对于经过身份验证的用户和来宾用户都是相同的。
我在这两种情况下都传递了授权令牌,但中间件路由我得到了用户详细信息,但非中间件路由我没有得到用户信息。
请指导我在哪里可以错过什么?
I need to solve the following problem: I created two applications using Laravel.
https://test.example.org and provides a passport-instance and all user-data (Model: User). https://test.org and uses the API Application A provides using an "api-user" that exists in Application A to fetch "public" dataNow I would like to provide a login method for users of Application B. All users that are using Application B are existing …
有没有办法从 Laravel 中的用户界面创建客户端?如果我需要允许用户创建和管理自己的客户端,如何在函数上下文中运行“passport:client”以便动态创建客户端?
我尝试制作 OauthClient 模型并实现生成客户端的表单,但如此创建的客户端在请求中无法识别(它们是 40 个字符的随机字符串)。
我如何检查当前用户从控制器访问方法是否经过身份验证,相关 API 路由不受任何身份验证中间保护,因为该路由可供公众和访客用户访问,我检查了我的请求标头不记名令牌正在通过,我正在为我的路线使用反应路由器。api驱动程序是passport
公共路线:
Route::get('product/list', 'ProductController@index')
尝试过什么:
将默认的 AUTH Guard 更改为api。
Auth()->guard('api')->check()尝试在控制器方法中显式调用。
if (Auth()->guard('api')->check()) {
return 'is_favourite';
} else {
return 'unauthenticated';
}
Run Code Online (Sandbox Code Playgroud)
Auth()->check() if (Auth()->check()) {
return 'is_favourite';
} else {
return 'unauthenticated';
}
Run Code Online (Sandbox Code Playgroud)
结果:
总是'unauthenticated'
预期结果:is_favourite在标头中传递承载令牌时的结果,如果未提供承载令牌,则为“未经身份验证”。
以下是我在 laravel 9 项目中的登录功能。我正在尝试通过创建身份验证令牌laravel-passport。
public function login(Request $request) {
$user = User::where('email', $request->email)->first();
if ($user) {
if (Hash::check($request->password, $user->password)) {
$token = $user->createToken('Laravel Password Grant Client')->accessToken;
$response['token'] = $token;
return response($response, 200);
} else {
$response = ["message" => "Password mismatch"];
return response($response, 422);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的回应是,
{
"token": {
"name": "Laravel Password Grant Client",
"abilities": [
"*"
],
"tokenable_id": 1,
"tokenable_type": "App\\Models\\User",
"updated_at": "2022-07-04T05:58:36.000000Z",
"created_at": "2022-07-04T05:58:36.000000Z",
"id": 62
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里没有得到任何令牌。请帮我解决这个问题。
我有来自oauth_clients 的client_id,需要获取秘密。由于secret属性是受保护的,因此无法进行常规的Model查询或DB查询。
我试图找到该方法返回的令牌$user->createToken('MyApp')->accessToken;存储在数据库中的位置,但似乎找不到。它首先存储在服务器中吗?如果是这样,在哪里?
如果由于它是独立的而未存储在服务器上,那么Laravel的开发人员为什么要进行$table->rememberToken();默认create_users_table.php迁移?专栏的目的是remember_token什么?
谢谢您的帮助。
laravel ×10
laravel-passport ×10
php ×5
laravel-5 ×2
api ×1
client ×1
jwt ×1
laravel-6 ×1
laravel-6.2 ×1
laravel-7 ×1
laravel-9 ×1
laravel-api ×1
oauth ×1
oauth-2.0 ×1
token ×1