所以我的移动应用将是客户端,我为此生成了一个client_id和一个client_secret。
使用移动应用程序的用户必须使用其用户名/密码登录。
我应该在哪里存储client_id和client_secret?是否可以公开它们并将它们简单地放置在应用程序中?
我已经为Laravel 5.3 设置了Laravel Passport包,正如官方文档(https://laravel.com/docs/5.3/passport#introduction)中所述.
我希望API由移动应用程序使用,因此我尝试实现密码授予令牌.我创建了一个密码授予客户端,以及令牌请求进程......
$response = $http->post('http://my-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'my@email.com',
'password' => 'my-password',
'scope' => '',
],
]);
Run Code Online (Sandbox Code Playgroud)
...按预期工作,为我的一个用户返回访问令牌和刷新令牌.
一方面,
php artisan route:list
Run Code Online (Sandbox Code Playgroud)
列出api/user URI的正确中间件:api,auth:api
api guard的驱动程序在config/auth.php中正确设置为passport.总而言之,安装过程的每一步都已完成(https://laravel.com/docs/5.3/passport#installation).
默认api.php的内容:
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:api');
Run Code Online (Sandbox Code Playgroud)
当我访问http://my-app.com/api/user时出现问题,因为它似乎是使用'web'中间件验证请求,而不是'api'...当我访问时,我是如果用户未登录,则重定向到/ login(登录表单),如果是,则重定向到/ home(登录表单)
任何帮助将非常感激.提前致谢.
'middleware' => 'auth:api'在客户端发送的常规端点上使用Authentication可以正常工作Authorization=Bearer <access_token>。
但现在,我想处理没有授权标头的普通图像下载请求,在查询字符串中具有访问令牌,如下所示:GET /picture/my_picture.png?access_token=1234。
我在中间件中尝试了类似的方法,但似乎无法在请求中添加标头:
if ($request->has('access_token')) {
// something like $request->header->set('Authorization', 'Bearer ' . $request->get('access_token'));
}
if ($this->auth->guard($guard)->guest()) {
// throw exception
}
Run Code Online (Sandbox Code Playgroud)
能做到吗?也许拦截或覆盖某物/其他地方?
当我使用postman与api.php文件时出现此错误.
在这里使用Laravel 5.4的文档示例是文件中的代码.
Route::get('/user', function (Request $request) {
return $request->user() ; })->middleware('auth:api');
Run Code Online (Sandbox Code Playgroud)
由于HasApiTokens存在于相关模型中,因此出现这些错误似乎非常不寻常,那么问题是什么?
我正在尝试使用 Laravel 护照身份验证创建 API,现在使用 Laravel 护照制作 API 非常容易。我正在使用个人访问令牌为 API 用户创建访问令牌。由于我的客户端和服务器都是一个,但是当 API 中未提供令牌时,它重定向到由 laravel auth scaffold 创建的登录页面php artisan make:auth,我想返回带有消息“未提供令牌”的 json 响应。
https://laravel.com/docs/5.4/passport#personal-access-tokens
我auth:api在路线中使用。
如果未提供令牌,如何为 API 传递 json 响应?
我试图passport在我的应用程序中实现验证api调用.我已经完成了官方文档中提到的配置.我在我的认证中有这个:
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
Run Code Online (Sandbox Code Playgroud)
而且,这在我的AuthServiceProvider's boot()方法中:
Passport::routes();
Run Code Online (Sandbox Code Playgroud)
这就是route我想要访问的内容:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::group(['namespace' => 'Api', 'middleware' => 'auth:api'], function () {
// Login Controller
Route::get('/getclc', 'PreController@getClc');
});
Run Code Online (Sandbox Code Playgroud)
我发送的header请求是这样的:
Authorization:Bearer $accessToken
Run Code Online (Sandbox Code Playgroud)
我的问题是:1.当请求受保护的路由时,它会将我发送到登录页面,但我希望它返回401.我该怎么做?
我的laravel版本是5.4.33.
Laravel Passport的默认响应如下所示:
{
"token_type": "Bearer",
"expires_in": 31536000,
"access_token": djabjkdakadbakdkakjdbjkba
}
Run Code Online (Sandbox Code Playgroud)
我需要添加一些自定义响应,例如:
{
"success":"true",
"message":"Login Successful",
"status":"200",
"data":{
"token_type": "Bearer",
"expires_in": 31536000,
"access_token":"djabjkdakadbakdkakjdbjkba"
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
我已经使用Laravel Passport项目构建了RESTful API。
它使用“客户证书授予”来授权我的第三方项目。
问题在于,对于来自第三方应用程序的每个api调用,它都会生成一个新的访问令牌。
到一天结束时,如果我有999个电话,我在oauth_access_tokens数据库表中还将有999条新记录。
是否有可能避免数据库中的大量访问令牌?
也许在League \ OAuth2 \ Server \ Grant \ ClientCredentialsGrant.php中:
public function respondToAccessTokenRequest(ServerRequestInterface $request, ResponseTypeInterface $responseType, \DateInterval $accessTokenTTL) {
$client = $this->validateClient($request);
$scopes = $this->validateScopes($this->getRequestParameter('scope', $request));
$scopes = $this->scopeRepository->finalizeScopes($scopes, $this->getIdentifier(), $client);
// $validToken = query to check if $client has existing token neither revoked or expired
// if ($validToken) {
// return $responseType->setAccessToken($validToken);
// }
$accessToken = $this->issueAccessToken($accessTokenTTL, $client, null, $scopes);
$responseType->setAccessToken($accessToken);
return $responseType;
}
Run Code Online (Sandbox Code Playgroud) 我刚刚使用Laravel Passport创建了一个简单的OAuth系统。该系统将负责外部应用程序用户的注册和身份验证。一切都按我的预期进行,现在我想实现一种机制,以在预定义次数的失败登录尝试后锁定用户。
我是Laravel和Passport的新手,是否有任何内置的软件包可以为我管理?还是我必须自己开发此功能?如果是这样,我该如何完成这项任务?
我一直在搜索整个互联网,但是直到现在我都找不到关于Passport OAuth的任何信息。
我遵循了 Laravel 官方文档以及以下文章 https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876
注册工作正常并返回令牌登录工作正常并返回令牌但是当我按照以下方式使用它时得到未经身份验证。
curl -X POST \
http://api.local/api/details \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjY0YmE0ZTUxMzBhYWQwYzdmZWVkODRhYTZhNzI4YjE2YjE1NWJhYzA0YmQwMmIxYWZjMGU3NTVjYzk1Y2QwYzY3ZWMzNTRlNzA1MTg0YjY4In0.eyJhdWQiOiIxIiwianRpIjoiNjRiYTRlNTEzMGFhZDBjN2ZlZWQ4NGFhNmE3MjhiMTZiMTU1YmFjMDRiZDAyYjFhZmMwZTc1NWNjOTVjZDBjNjdlYzM1NGU3MDUxODRiNjgiLCJpYXQiOjE1Mzc4NzIxNjcsIm5iZiI6MTUzNzg3MjE2NywiZXhwIjoxNTY5NDA4MTY3LCJzdWIiOiIwIiwic2NvcGVzIjpbXX0.GHGKOiWm_8gr4Hib0ZtCq_FdQSDAntPl2zPIHkkTfTien1PHCoE79S7MdZRdEhjxt5Ds5E2JXhajfa9rDfiXHzKGtmzcRD_VYYxKnWupnhiMlJeHJsmXaWKLjYIw3InQYZtV_cYdcXlYWTDWcCOR1Xr7ezkYECz16oOumtgarPxVRZTHehpj4WiRDDgB4VTRZiRfsHYxMruh55wuT8OkbUAOalRaqwwxfplLYwdfTAcu4vUdwPfswu2_eZ6l1b_8Jd8Jsk5niXROQ7pIAL1oYX0V_HbNz9YkrlbiZN-w9FoM3fMZpYL7hcg1Jcocd7dGPUkcGaMOMjjcRuj5XAKEJOZbQlxs0n5wo4W3Sz11bnO4dRetTj9hyF97QDoaHFduPj4tnn6lItRbBGjQTGy_5qNlckhXxRYTlsYUZ6oNUUU2bUV_hBdklYRCtWgY1DY-Ds0DVhuujea9_u0w0swDwRh5VlV_gQaKEO0sEv-fzg_23UdPpfHgaG8-NHTYs5LsRSNS1iz4hpXuTjZzUOBsAk_k-V13wjeeXElLxy2PgN5s87IVJPEvDtd5F89PjzvaDHM5wsYwmUlnCnzBa8ZEtG8Wj62qBY_RooBmSNzWlT62SpJDbs25GaWOf8y7EtuICcuaOg7bMoGICKJc4GmkK_ltk-M7WieJD95InnWBJ-E'
Run Code Online (Sandbox Code Playgroud)
返回
{
"error": "Unauthenticated."
}
Run Code Online (Sandbox Code Playgroud)
路线:
Route::post('login', 'API\UserController@login');
Route::post('register', 'API\UserController@register');
Route::group(['middleware' => 'auth:api'], function(){
Route::post('details', 'API\UserController@details');
});
Run Code Online (Sandbox Code Playgroud)
身份验证服务提供者:
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addYear(21));
Passport::refreshTokensExpireIn(Carbon::now()->addYear(30));
}
Run Code Online (Sandbox Code Playgroud)
配置/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Run Code Online (Sandbox Code Playgroud)
任何想法,为什么 /details 请求没有通过有效令牌进行身份验证事件?
laravel-passport ×10
laravel ×8
php ×6
laravel-5.3 ×3
api ×2
laravel-5 ×2
laravel-5.4 ×2
access-token ×1
laravel-5.6 ×1
mysql ×1
oauth ×1
oauth-2.0 ×1