注意:我在这个问题上有4个赏金,但下面没有提出的答案是这个问题所需要的答案.所需的一切都在下面的Update 3中,只是寻找要实现的Laravel代码.
更新3:此流程图正是我想要完成的流程,下面的所有内容都是原始问题以及一些较旧的更新.该流程图总结了所需的一切.
下面的流程图中的绿色部分是我知道如何做的部分.红色部分及其旁注是我正在寻找帮助完成使用Laravel代码.
我已经做了很多研究,但是当使用Laravel和JWT httponly cookie进行自我消费的API时,信息总是很短而且不完整(大多数在线教程只显示JWT存储在本地存储中,这不是很安全).看起来像包含JWT by Passport的httponly cookie应该用于识别Javascript端的用户,当每次请求发送到服务器以验证用户是否是他们所说的用户时.
还有一些额外的东西需要全面了解如何使这个设置工作,我没有在一个教程中遇到这个包括:
我希望这个问题的答案可以作为一个易于遵循的指南,为未来的读者和那些正在努力寻找一个自我消费API的上述观点的答案.
更新1:
CreateFreshApiToken之前的功能,但是在撤销用户令牌时这不起作用(上面的第3点和第4点).这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken中间件:由此中间件创建的JWT令牌不会存储在任何位置.它们不能被撤销或"不存在".它们只是为您的api调用提供了一种通过laravel_token cookie进行authed调用的方法.它与访问令牌无关.另外:您通常不会在发布它们的同一个应用程序上使用客户发出的令牌.您可以在第一方或第三方应用中使用它们.使用中间件或客户端发出的令牌,但不能同时使用两者.
所以似乎能够迎合第3点和第4点来撤销令牌,如果使用CreateFreshApiToken中间件则不可能这样做.
Authorization: Bearer <token>处理安全的httpOnly cookie 似乎不是一种方法.我认为请求/响应应该包含安全的httpOnly cookie作为请求/响应头,像这样基于laravel文档:使用此身份验证方法时,默认的Laravel JavaScript脚手架指示Axios始终发送X-CSRF-TOKEN和X-Requested-With标头.
headerswindow.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': (csrf_token goes here)
};
Run Code Online (Sandbox Code Playgroud)
这也是我寻找涵盖上述所有要点的解决方案的原因.道歉,我使用的是Laravel 5.6而不是5.5.
更新2:
似乎密码授予/刷新令牌授权组合是要走的路.使用密码授予/刷新令牌授权组合寻找易于遵循的实施指南.
密码授予: 此授权适用于与我们信任的客户交易,例如我们自己网站的移动应用.在这种情况下,客户端将用户的登录凭据发送到授权服务器,服务器直接发出访问令牌.
刷新令牌授权: 当服务器发出访问令牌时,它还会为访问令牌设置到期时间.当我们想要在访问令牌过期时刷新访问令牌时,使用刷新令牌授予.在这种情况下,授权服务器将在发出访问令牌时发送刷新令牌,该令牌可用于请求新的访问令牌.
我正在寻找一个易于实现,直接,全面的答案,使用密码授予/刷新令牌授权组合,涵盖上述原始5点的所有部分与httpOnly安全cookie,创建/撤销/刷新令牌,登录cookie创建,注销cookie撤销,控制器方法,CSRF等
csrf-protection laravel cookie-httponly laravel-5 laravel-passport
I'm using laravel/passport:7.5.1 package in my laravel project and recently faced with this exception. Any Idea? I temperory downgrade the lcobucci/jwt:3.4.0 package to lcobucci/jwt:3.3.3
Replicating claims as headers is deprecated and will removed from v4.0. Please manually set the header if you need it replicated.
Run Code Online (Sandbox Code Playgroud)
Stack Trace:
"exception": {
"trace": [
"/var/www/app/vendor/lcobucci/jwt/src/Builder.php:334",
"/var/www/app/vendor/lcobucci/jwt/src/Builder.php:185",
"/var/www/app/vendor/lcobucci/jwt/src/Builder.php:201",
"/var/www/app/vendor/league/oauth2-server/src/Entities/Traits/AccessTokenTrait.php:34",
"/var/www/app/vendor/league/oauth2-server/src/ResponseTypes/BearerTokenResponse.php:28",
"/var/www/app/vendor/league/oauth2-server/src/AuthorizationServer.php:202",
"/var/www/app/vendor/laravel/passport/src/PersonalAccessTokenFactory.php:114",
"/var/www/app/vendor/laravel/passport/src/PersonalAccessTokenFactory.php:71",
"/var/www/app/vendor/laravel/passport/src/HasApiTokens.php:67",
"/var/www/app/app/Http/Controllers/Auth/Shop/GetTokenController.php:84",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:219",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:176",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:680",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php:58",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:682",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:657",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:623",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:612",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:176",
"/var/www/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30", …Run Code Online (Sandbox Code Playgroud) 这2个有什么区别?哪个更适合简单的 VueJS 应用程序?我已经阅读了他们的文档几次,但仍然很困惑。非常感谢。
我目前正在使用2个项目.1个前端(使用laravel后端与API通信)和另一个laravel项目(API).
现在,我使用Laravel Passport对用户进行身份验证,并确保每个API调用都是授权调用.
现在,当我想要注销我的用户时,我发送一个帖子请求到我的API(带有Bearer令牌)并尝试将他从API中注销(并清除会话,cookie,...)
然后在客户端上我也刷新我的会话,以便不再知道令牌.现在,当我返回登录页面时,它会自动登录我的用户.(或者我的用户还在登录).
有人可以解释我如何使用Laravel护照正确注销用户吗?
提前致谢.
现在我正在使用类似的东西来验证我的基站上的用户:
if (Auth::attempt($request->only(['id', 'password']))) {
//
}
Run Code Online (Sandbox Code Playgroud)
如何修改此代码以使用自定义列作为用户名? https://laravel.com/docs/5.3/passport#password-grant-tokens
我对laravel范围部分有点困惑.
我有一个用户模型和表.
如何为用户分配用户,客户和/或管理员的角色.
我有一个带vue和laravel api后端的SPA.我使用https://laravel.com/docs/5.3/passport#consuming-your-api-with-javascript
Passport::tokensCan([
'user' => 'User',
'customer' => 'Customer',
'admin' => 'Admin',
]);
Run Code Online (Sandbox Code Playgroud)
如何指定哪个用户模型具有哪个范围?
或者范围与角色不同?
你会如何实现这个?
提前致谢!
我正在使用laravel passport进行API身份验证,当我将它与一个数据库一起使用时,它可以正常工作,但401在使用多个数据库时会提供,
我在做什么:
oauth_clients子分贝将从主数据库复制密码同意令牌和个人访问令牌和子数据库中插入,也插入client_id中oauth_personal_access_clients.我正在做所有passport:install命令的程序.(如果我没有遗漏某些东西).
当我从主DB它完美的凭据登录,真正的问题,当我与子数据库凭据登录开始,我可以从PARAM获得子DB client_code与I输入email,password同时登录.
它允许我从子数据库登录但我得到401 Unauthenticated 错误,登录时获取访问令牌,我从前面登录后通过每个请求传递AuthenticationHeader .BearerAngular
不知道我在这里缺少什么.
DBConnection中间件
DBConnection中间件在登录后为每个请求设置连接,
public function handle($request, Closure $next)
{
if ( $request->method() != 'OPTIONS' ) {
$this->access_code = $request->header('access-code');
if ( $this->access_code != '' && $this->access_code != 'sa' ) {
app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_PREFIX.$this->access_code);
} else {
app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_DEFAULT);
}
}
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
DBConnection为database.php动态设置默认数据库,因为我正在调用setDB创建的方法Controller.php
setDB …
我今天使用 laravel/passport 进行 api 身份验证我的旧访问令牌不起作用,当我尝试生成新的访问令牌时,我得到了
不推荐从字符串中隐式转换键。请使用 InMemory 或 LocalFileReference 类。{"exception":"[object] (ErrorException(code: 0): 不推荐从字符串隐式转换键。请使用 InMemory 或 LocalFileReference 类。
有人有任何解决方案吗?
在我们的应用程序用户注销时,我们通过这种方式使该特定设备的访问令牌无效.
$user = $request->user();
$value = $request->bearerToken();
$id = (new Parser())->parse($value)->getHeader('jti');
$token = $user->tokens->find($id);
$token->revoke();
Run Code Online (Sandbox Code Playgroud)
但是当用户停用他/她的帐户时,我们希望从用户登录的所有设备中使所有访问令牌无效.我查看了文档但没有找到任何有用的内容.谢谢
我目前正在学习如何在Laravel中创建一个API,我发现自己陷入了这个令人困惑的概念.经过几天的研究和实践,我终于可以理解这个概念,制作一个迷你指南.我不得不查看很多单独的网页,所以我会尽力解释它们之间的关系.
laravel ×10
laravel-passport ×10
php ×4
oauth-2.0 ×3
jwt ×2
auth0 ×1
laravel-5 ×1
laravel-5.3 ×1
laravel-7 ×1
scopes ×1
thephpleague ×1