我正在使用Laravel Passport来访问我的API的某些部分到第三方应用程序.
但是,我也通过自己的第一方原生Android应用程序使用自己的API.因此,在这种情况下,我查看整个互联网以获得最佳实践,但是仍然坚持得出结论.
以下是我发现的可能性:
我可以按照用户凭据密码授予流程.
在这种情况下,我需要传递一个client_secret和client_id授权服务器.为了保证他们的安全,我不能在我的移动应用程序的源代码中编写它们(APK可以解密...).
所以,我有两个选择.
在调用oauth端点之前,通过我自己的服务器代理并注入秘密:
$proxy = Request::create('/oauth/token', 'post', [
'grant_type' => 'password',
'client_id' => 1,
'client_secret' => 'myownclientsecretishere',
'username' => $username,
'password' => $password
]);
$proxy->headers->set('Accept', 'application/json');
$response = app()->handle($proxy);
Run Code Online (Sandbox Code Playgroud)
使用中间件调用oauth端点时注入秘密:
class InjectPasswordGrantSecret
{
public function handle($request, Closure $next)
{
$request->request->add([
'client_id' => 1,
'client_secret' => 'myownclientsecretishere'
]);
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
这些是工作示例,但它们在资源方面也很贪婪.我尝试在本地计算机上使用Apache基准测试,我得到了9个请求/秒.
我正在使用 Laravel 5.8 虽然6.0.3可用。我使用它是因为我遵循的教程使用的是 Laravel 5.8。
什么时候,我命令:
composer require laravel/passport
Run Code Online (Sandbox Code Playgroud)
它抛出一个错误
无法将您的要求解析为一组可安装的软件包。
问题 1 - 结论:删除 laravel/framework v5.8.35 - 结论:不要安装 laravel/framework v5.8.35 - laravel/passport 8.x-dev 需要照明/加密 ^6.0|^7.0 -> 可通过照明/加密满足[6.x-dev, 7.0.x-dev, v6.0.0, v6.0.1, v6.0.2, v6.0.3, v6.0.4, v6.1.0, v6.2.0, v6.3.0, v6.4.1]。- laravel/passport v8.0.0 需要照明/加密 ^6.0|^7.0 -> 照明/加密 [6.x-dev, 7.0.x-dev, v6.0.0, v6.0.1, v6.0.2, v6 可满足。 0.3、v6.0.4、v6.1.0、v6.2.0、v6.3.0、v6.4.1]。- 不要安装照明/加密 6.x-dev|不要安装 laravel/framework v5.8.35 - 不要安装照明/加密 7.0.x-dev|不要安装 laravel/framework v5.8.35 - 不要'不安装illumination/encryption v6.0.0|不安装laravel/framework v5.8。8.35,需要为 5.8.*) -> 可满足 laravel/framework[v5.8.35]。- laravel/passport ^8.0 的安装请求 -> laravel/passport[8.x-dev, v8.0.0] 可满足。
安装失败,将 …
我刚刚下载了最新的laravel 5.3并且我正在尝试安装护照,但是我收到以下作曲家错误:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- laravel/passport v2.0.0 requires illuminate/http ~5.4 -> satisfiable by illuminate/http[v5.4.0].
- laravel/passport v2.0.1 requires illuminate/http ~5.4 -> satisfiable by illuminate/http[v5.4.0].
- Conclusion: don't install illuminate/http v5.4.0
- Installation request for laravel/passport ^2.0 -> satisfiable by laravel/passport[v2.0.0, v2.0.1].
Installation failed, reverting ./composer.json to its original content.
Run Code Online (Sandbox Code Playgroud)
Composer .json文件
http://pastebin.com/ne4RkL96
我不知道我做错了什么.我无法设置令牌过期时间.
<?php
namespace App\Providers;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerPolicies();
Passport::tokensExpireIn(Carbon::now()->addDays(1));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时$user->createToken(),例如:
<?php
// as a demo
namespace App\Http\Middleware;
class ParseSpecialToken
{
public function handle($request, Closure $next)
{
$user = User::find(1);
$accessToken = $user->createToken('Some token')->accessToken;
$request->headers->add(['Authorization' => 'Bearer '. $accessToken]);
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
令牌到期仍为1年,而不是1天.为什么?如何更改exp时间?
我正在编写一个小sms网关,供几个项目使用,
我实施了laravel passport身份验证(客户端凭据授权令牌)
然后我添加CheckClientCredentials到api中间件组:
protected $middlewareGroups = [
'web' => [
...
],
'api' => [
'throttle:60,1',
'bindings',
\Laravel\Passport\Http\Middleware\CheckClientCredentials::class
],
];
Run Code Online (Sandbox Code Playgroud)
逻辑工作正常,现在在我的控制器中我需要让客户端与有效令牌相关联.
routes.php文件
Route::post('/sms', function(Request $request) {
// save the sms along with the client id and send it
$client_id = ''; // get the client id somehow
sendSms($request->text, $request->to, $client_id);
});
Run Code Online (Sandbox Code Playgroud)
出于明显的安全原因,我永远不能发送带有消费者请求的客户端ID,例如$client_id = $request->client_id;.
我使用Laravel的护照包为我的rest api提供基于令牌的身份验证.现在,我正在使用个人访问令牌概念来生成访问令牌.
要为单个用户生成访问令牌,我使用下面的代码生成名为" android " 的令牌.
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
// Here the access token will be stored in $token variable.
$token = $user->createToken('android')->accessToken;
// Now the $token value would be something like
//eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImMyNjI3YzU0YjFhNWIxZTFlMTdkODhmZTk1NzhjNzAzY2QyMTU0MzhlOD...
Run Code Online (Sandbox Code Playgroud)
稍后我想在我的管理仪表板上显示个人访问令牌,我很难再次获得生成的令牌.尝试下面的代码,但无法获取访问令牌.
$user = User::find(1)
dd($user->tokens())
Run Code Online (Sandbox Code Playgroud)
我也尝试使用护照vue元素,但它只显示访问令牌名称,而不是实际令牌.
<passport-personal-access-tokens></passport-personal-access-tokens>
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.
谢谢
我知道我们可以在Web应用程序中使用json Web令牌进行用户身份验证.应用程序客户端向应用程序服务器发送一对用户名和密码,Web应用程序服务器将JSON Web令牌返回给应用程序客户端.
今天,我在Laravel 5.4文档中阅读了一些关于人员访问令牌的段落.但是,我不确定它们是否有意义.什么是人员访问令牌?Laravel中的人员访问令牌等同于用户身份验证的JSON Web令牌?
谁能帮我?
正在Laravel Passport 用于构建 API,我相应地删除了网络路由及其防护
如何测试用户注销?
这是我到目前为止:
Logout Test
/**
* Assert users can logout
*
* @return void
*/
public function test_logout()
{
// $data->token_type = "Bearer"
// $data->access_token = "Long string that is a valid token stripped out for brevety"
$response = $this->json('POST', '/api/logout', [], [
'Authorization' => $data->token_type . ' ' . $data->access_token
]);
$response->assertStatus(200);
}
Run Code Online (Sandbox Code Playgroud)
routes/api.php
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
Run Code Online (Sandbox Code Playgroud)
控制器方法使用AuthenticatesUserstrait,因此保留默认功能
/**
* Log the user out of the application.
*
* @param \Illuminate\Http\Request $request
* …Run Code Online (Sandbox Code Playgroud) 我已经安装了laravel 5.3和护照包.我一步一步地遵循文档,我可以使用POST /oauth/token以下参数和以下参数
我收到以下回复
{
"token_type": "Bearer",
"expires_in": 31536000,
"access_token": "access token here",
"refresh_token": "refresh token here"
}
Run Code Online (Sandbox Code Playgroud)
然后我要求 GET /api/user
使用以下标题
这工作正常,所以所有apis.
我遇到的问题是我在第一次请求中自我验证并输入了用户名和密码并返回给我的访问令牌的用户是我从laravel web view/register创建的用户
如何从api路由文件创建新用户或注册新用户
喜欢 POST /api/register
用户第一次需要注册才能在此之后进行身份验证.
我是否应该在没有oauth的情况下创建这条路线进行注册,然后如果注册成功则要求他POST /oauth/token进行身份验证或者是什么?我错过了什么?
更新已
的clent_secret是它的权利是在所有用户请求不变或每个用户应该有不同势clent_secret,如果是如何创建aclent秘密,如果它neaded到authinticate用户?
使用护照进行移动应用的api身份验证.应用程序开发人员很快就会抱怨提供的access_token的大小(1071个字符)并且必须在每个请求中传递它.
在调查时,令牌的大部分是签名部分.默认情况下,护照生成一个4096bit的rsa密钥.我发现我可以通过生成1024位密钥将令牌大小减少到559个字符.更好,但仍然比Facebook等其他服务生成的密钥大得多.
我找不到关于这个问题的很多信息,这是一个有争议的问题吗?1KB令牌没什么可抱怨的吗?减小密钥大小是个坏主意吗?还有什么可以减少尺寸的吗?
更新: 我们已决定继续不对密钥大小进行任何更改.
laravel-passport ×10
laravel ×7
php ×7
oauth-2.0 ×5
laravel-5 ×4
api ×1
composer-php ×1
jwt ×1
laravel-5.3 ×1
laravel-5.4 ×1
laravel-5.8 ×1
oauth ×1
phpunit ×1
security ×1