我遵循了Laracast中提到的确切步骤:Laravel 5.3中的新增功能:Laravel Passportapi authentication使用实现oauth2。
我web.php在客户/消费者项目中的文件如下所示:
use Illuminate\Http\Request;
Route::get('/', function () {
$query = http_build_query([
'client_id' => 2,
'redirect_uri' => 'http://offline.xyz.com/callback',
'response_type' => 'code',
'scope' => '',
]);
return redirect ('http://api.xyz.com/oauth/authorize?'.$query);
});
Route::get('/callback', function (Request $request){
$http= new GuzzleHttp\Client;
$response = $http->post('http://api.xyz.com/oauth/token',[
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 2 ,
'client_secret' => 'tUGYrNeWCGAQt220n88CGoXVu7TRDyZ20fxAlFcL' ,
'redirect_uri' => 'http://offline.xyz.com/callback',
'code' => $request->code,
],
]);
return json_decode((string) $response->getBody(), true);
});
Run Code Online (Sandbox Code Playgroud)
我正在获得权限请求页面,我需要在该页面上authorize允许我的客户端访问api。但是,一旦单击授权,我将被重定向到显示以下消息的页面: …
所以,我正在使用Laravel + Passport,到目前为止工作正常.
但是,我想对护照代码进行一些小改动(好吧,不是在供应商文件夹中,我希望),一旦我要求用户更改密码,以防他第一次登录.
那么,我需要的是两件事(我相信):
1 - 如何在oauth/token响应中再添加一个信息?与access_token一起,我想从DB中添加一个需要NewPassword = true/false的列.
2 - 如果needsNewPassword为true,则应用程序将重定向到另一个屏幕,用户将在该屏幕上设置新密码.我将设置新密码,删除needsNewPassword的标志并向用户发回新的access_token.然后,用户将仅使用该access_token.如何重新生成新的access_token?
谢谢你的帮助!若昂
对于每个请求,我发现有4个查询被激活以验证用户和令牌.其中一个是根据用户ID获取用户(从用户中选择*).这些查询由Passport/Laravel触发但我想要的是修改此查询以添加一个状态字段检查以检查在令牌有效期内是否有任何用户变为无效.如果我们只检查id,那么任何用户是否变为非活动状态(通过更改状态,我们也无法阻止用户,因为删除用户的令牌对我来说不是一个好的解决方案).
查询在Passport Laravel的每个请求中触发:
select * from oauth_access_tokens where id = ?
select * from user where id = ? limit 1 ["2"]
select * from oauth_access_tokens where id = ?
select * from oauth_clients where id = ?
Run Code Online (Sandbox Code Playgroud)
所以,任何人都可以告诉我如何在令牌验证时更改护照中的'select*from user where id'查询.
我有一个使用Passport身份验证的Laravel应用程序.
登录
public function authenticate(Request $request)
{
$params = [
'grant_type' => 'password',
'client_id' => 1,
'client_secret' => "secret",
'username' => request('username'),
'password' => request('password'),
'active' => 1,
'scope' => '*'
];
$request->request->add($params);
// verify the credentials and create a token for the user
$proxy = Request::create('oauth/token', 'POST');
return Route::dispatch($proxy);
}
Run Code Online (Sandbox Code Playgroud)
我已经解决了AuthServiceProvider的到期问题:
Passport::routes(function ($router) {
$router->forAccessTokens();
});
Passport::tokensExpireIn(now()->addMinute(1));
Passport::refreshTokensExpireIn(now()->addDays(30));
Run Code Online (Sandbox Code Playgroud)
它可以工作,但1分钟后令牌到期.我想要一个不同的令牌到期日期,具体取决于我尝试登录的位置,因为我有一个网站,桌面应用程序和一个Android应用程序.
例如:
我想从我试图登录的地方发送给我,但这是一个好方法吗?还有其他可能的方法吗?
现在我试过这个:
- )从AuthServiceProvider中删除:
Passport::tokensExpireIn(now()->addMinute(1));
Run Code Online (Sandbox Code Playgroud)
并在登录功能中添加:
if (request('from') == 'something') {
Passport::tokensExpireIn(now()->addYears(1));
} else …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) 在我的单元测试中,我有一个为其生成令牌的用户:
$tokenString = $this->user->createToken('PHPunit', ['example'])->accessToken;
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 。
我正在尝试使用客户端凭据授予令牌进行机器对机器身份验证。我有两个独立的站点(API 和 Web)。
我在 API 上创建了一个客户端凭据授予客户端。
php artisan passport:client --client
Run Code Online (Sandbox Code Playgroud)
在 Web 上,我尝试使用以下代码从 API 检索令牌。PASSWORD_ID/PASSWORD_SECRET 存储在我的 .env 文件中,我直接从数据库中复制它们,因此它们绝对正确。
$guzzle = new GuzzleHttp();
$response = $guzzle->get('http://testsite-api.test/oauth/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => env('PASSPORT_ID'),
'client_secret' => env('PASSPORT_SECRET'),
],
]);
Run Code Online (Sandbox Code Playgroud)
由此我收到以下错误:
客户端错误:
POST http://testsite-api.test/oauth/token导致401 Unauthorized响应:{"error":"invalid_client","error_description":"客户端身份验证失败","message":"客户端身份验证失败"}
请注意:我将此代码拉到我的 Mac(使用代客泊车)上,它立即生效。
我已经使用邮递员对其进行了测试,并且第一次使用了 Web 中使用的相同 ID/SECRET。
任何想法我哪里出错了?我相当确定这是一个宅基地问题,但我很难找到解决办法。
我的应用程序在 Laravel 8 上使用laravel/passport 10.0.1. 将php开发服务器上的版本从升级7.4到 后8.0,It was not possible to parse your key, reason: ""出现错误(没有来自 openssl_error_string 的任何消息)。
任何想法如何解决它?
laravel-passport ×10
laravel ×8
php ×7
flutter ×1
homestead ×1
laravel-5 ×1
laravel-5.3 ×1
oauth ×1
oauth-2.0 ×1
permissions ×1
php-8 ×1
roles ×1