我已经设置了一个带有客户端身份验证的 Laravel 应用程序。我将我的客户端 ID 和客户端密码发送给它,它给了我一个令牌。我可以登录我的 Laravel 应用程序,但我不知道如何获取已授权客户端的 ID。
我已经看到了用于auth()->user()->Token()->getAttribute('client_id')获取客户端 ID 的提示,但是由于我只使用客户端,因此没有用户,并且我收到有关尝试在空对象上调用 Token() 的错误。Auth::id()也一无所获。我用 获取了标头中的令牌Request::header('Authorization'),但它与数据库中的任何内容都不匹配。
我正在使用laravel/passport password_grant进行身份验证。整个生成access_token和refresh_token过程工作正常。现在我正在尝试使用 Laravel 护照令牌事件来撤销旧令牌。
我参考了这篇文章的过程 - https://laracasts.com/discuss/channels/laravel/laravel-passport-revoke-and-prune-event-listener-is-not-doing-anything
这有效......但是当access token使用先前提供的刷新时refresh token,access token正在创建一个新的并创建一个新的refresh token存在。最终,在撤销 old 时access token, old, not expiredrefresh token也被撤销。
但我认为,refresh token只有在它到期时才必须撤销。
而且当我EventListeners从App\Providers\EventServiceProvider $listen array 中删除时,撤销机制仍然有效。
这就像拔掉插头灯泡仍然亮着一样。
如何解决这个问题?还是我在某个地方的概念有误?
authentication access-token laravel refresh-token laravel-passport
在我的项目,我整合Laravel护照才能使用我的API在我的应用程序,如所描述这里。
我的问题是关于laravel_tokencookie的过期时间。在这里可以看到,我的应用程序发回的 cookie 被检查以验证它没有过期。这个到期时间似乎是由我的会话生命周期定义的 - 请参阅此处。
这似乎意味着 laravel_token cookie 将在我的应用程序的用户注销后仍然有效,只要会话时间没有过期(实际上,如果我删除服务器上的所有会话并且注销我的用户,使用 cookie 的 API 请求仍然成功)。
这是预期的行为吗?如果用户注销,是否有办法自动使 cookie 过期?(我知道 cookie 已从用户的系统中删除,但我是从 cookie 被劫持或被盗的理论可能性来看它的,然后只要会话生命周期没有过期就可以使用)。
我正在使用 Laravel Event Broadcast 和 Pusher 在我的 API 和 Web 上利用 websocket。如果我单独尝试它们,两者都可以正常工作。我的意思是:
Broadcast::routes(['middleware' => 'web']); // this works for my Laravel website
Broadcast::routes(['middleware' => 'auth:api']); // this works for my api
Run Code Online (Sandbox Code Playgroud)
但是,如果我想像这样同时使用两者:
Broadcast::routes(['middleware' => ['auth:api', 'web']]); // doesn't work
Run Code Online (Sandbox Code Playgroud)
...它同时崩溃,我怀疑它假设我正在尝试为两个auth:api && web中间件启用。
有没有办法为此使用 OR 类型的语句(auth::api || 'web')?如果我想同时使用两者,并且如果它通过一个中间件,它会绕过中间件怎么办。
请注意,我的 api 使用的是 Laravel Passport。
或者有没有办法为两者结合并创建一个混合中间件(这将基本上检查 api 或 web)?所以我可以使用这样的东西:
Broadcast::routes(['middleware' => 'broadcast']); // or auth:broadcast
Run Code Online (Sandbox Code Playgroud)
更新:
据我了解,如果我创建一个名为 的新中间件broadcast,我可以这样做:
class BroadcastMiddleware() {
public function handle() {
$web = …Run Code Online (Sandbox Code Playgroud) middleware laravel laravel-events laravel-passport laravel-5.5
客户端将用户名和密码发送到服务器。
然后,服务器检查此用户是否已通过身份验证。
如果是,则服务器返回客户端的访问令牌。
然后用户可以使用此访问令牌访问受保护的资源...
这样做的好处是,我们不会通过API调用发送用户信息,并且访问令牌不会持续很长时间,因此黑客将无法发现用户身份验证信息(用户名和密码),以及发现,访问令牌的持续时间不足以对其执行任何操作。
这就是我了解Laravel护照API安全性的方式。
这里令人困惑的是,在第一次API调用时,用户必须发送用户名和密码,因此黑客仍然有很大的机会找出用户信息!!!
我知道我的理解有问题,这就是为什么我会感到困惑,任何解释都将不胜感激。
当我尝试通过 laravel 护照设置会话时出现以下错误
"message": "会话存储未根据请求设置。", "exception": "RuntimeException",
如何结合 Passport 身份验证和普通 Laravel 身份验证?
我希望用户登录 web-middleware 和 api-middleware 的页面。登录路由在 api-middleware 中。目前我已经设置了 Passport 身份验证,它适用于所有 api-middleware 路由。如何让用户也登录到网络中间件?
编辑 #1
我在做什么:
登录代码
$http = new \GuzzleHttp\Client();
try {
$response = $http->post(config('services.passport.login_endpoint'), [
'form_params' => [
'grant_type' => 'password',
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'username' => $args['email'],
'password' => $args['password']
]
]);
$user = User::where('email', $args['email'])->first();
Auth::guard('web')->login($user);
return [
"token" => $response->getBody()->getContents(),
"user" => $user
];
} // ...
Run Code Online (Sandbox Code Playgroud)
在某个网络中间件路线中的某处
return auth()->check() ? "logged in" : "not logged in";
Run Code Online (Sandbox Code Playgroud)
返回“未登录”
我有以下政策来确定用户是否能够查看合同。
public function view(User $user, Contract $contract)
{
if ($user->user_type->id == 2) { // If user is a vecino
if ($user->id == $contract->customer_id) {
return true;
}
} else if ($user->user_type->is_admin == true) { // If user is an admin
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
然后检查授权
$this->authorize('view', $contract);
Run Code Online (Sandbox Code Playgroud)
如何检查列表/数组/集合的授权?就像我通过以下方式获得合同清单一样Contract::all()
我还没有找到任何方法来做到这一点。我可以做一个循环并为每次迭代调用 $this->authorize 来检查授权,但这可能会影响性能。
有没有更好的方法来做到这一点?
在我的项目中,我将通过使用短信发送确认码来验证用户电话号码。确认后,我必须向我的 Laravel 应用程序发送登录请求。在Laravel Passport文档中有登录用户的示例请求:
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
Run Code Online (Sandbox Code Playgroud)
我如何在这里设置为username用户phone并删除password?
如果password是 Laravel Passport 中的必填字段,那么我可以从客户端发送任何密码并password在attempt用户凭据之前发送请求用户。但是我必须在哪里输入密码?
我已经厌倦了改变LoginController但没有工作。
登录控制器
protected function validateLogin(Request $request)
{
$request->validate([
$this->username() => 'required|string'
]);
}
protected function credentials(Request $request)
{
$params = [
'password' => '12345678',
];
$request->request->add($params);
return $request->only($this->username(), …Run Code Online (Sandbox Code Playgroud) 我需要你的帮助。
我用 Laravel 制作了一个 API,用 FLutter 制作了一个 APP。
现在我想让谷歌登录。
在浏览器或休息客户端,如 Insomnia、Postman 或类似的工作正常。这是因为系统向我显示了一个谷歌页面,我必须写下我想登录的电子邮件或谷歌用户,然后显示另一个页面来写密码。最后,所有返回到 APIS 回调端点,显示数据(令牌等)。
但是,当我从我的 flutter 应用程序中执行此操作时,我需要指示用户帐户的第一个 google 页面会像字符串响应一样发送(此字符串响应是 HTML。我认为是我们选择或帐户上的 google 页面中的 HTML) .
如何显示此页面并获得回复?
注意:像flutter_inappbrowser这样的 flutter 插件对我来说没有用,因为这个插件需要一个 URL 并显示它。当我使用flutter 的 http.get时,我得到了字符串上的 HTML 。
laravel ×10
laravel-passport ×10
access-token ×1
api ×1
flutter ×1
laravel-5 ×1
laravel-5.5 ×1
middleware ×1
permissions ×1
php ×1
roles ×1
security ×1