我们正在将 Laravel 网站改造成 Laravel SPA,并在未来将其改造成使用 Web 应用程序的移动应用程序,因此我们需要某种 API 身份验证。为此,我们使用 Laravel Passport。
我一直在使用 Laravel 5.5 并遵循文档上的指南,但是当我尝试使用 postman 的新登录时,服务器冻结,HTTP 请求永远不会处理。
经过一些调试,我发现当我使用 Guzzle 发布到 /oauth/token 路由时,它崩溃了。但是当我使用 Postman 访问该路由时,没有问题。
这是我的代码:
public function login(Request $request){
$http = new Client();
var_dump(1);
//die
$response = $http->post('http://localhost:8000/oauth/token', [ //Con postman esta ruta funciona
'form_params' => [
'grant_type' => 'password',
'client_id' => env('PASSWORD-CLIENT_ID',2),
'client_secret' => env('PASSWORD-CLIENT_SECRET',2),
'username' => $request->username, //parece usar correo, no nombre de usuario
'password' => $request->password,
'scope' => '*',
],
]);
var_dump(2);
//die;
return json_decode((string) $response->getBody(), …Run Code Online (Sandbox Code Playgroud) 您好,我正在尝试从用户对象生成令牌,如下所示:
<?php
namespace App\Http\Controllers\API\Auth;
use App\Models\User;
use App\Http\Controllers\Controller;
use Auth;
use Response;
class LoginController extends Controller
{
public function login() {
$content = [];
if(Auth::attempt(['email' => request('username'), 'password' => request('password')])){
$user = Auth::user();
$role = $user->roles()->first()->name;
$content['access_token'] = $user->createToken('Token Name')->accessToken;
$status = 200;
}
else{
$content['error'] = "Unauthorised";
$content['message'] = "Your email or password are incorrect";
$status = 401;
}
return response()->json($content, $status);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到 500 服务器错误:
Trying to get property of non-object
Run Code Online (Sandbox Code Playgroud)
我在用户模型上有 HasApiTokens,并且使用内置 Passport 路由生成令牌没有问题。
这是堆栈跟踪的第一部分:
[2018-06-12 …Run Code Online (Sandbox Code Playgroud) 我在我的用户模型中实现了 MustVerifyEmail 接口
\n\nclass User extends Authenticatable implements MustVerifyEmail\nRun Code Online (Sandbox Code Playgroud)\n\n我还制作了 VerificationApi 控制器
\n\n<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Models\\User;\nuse Illuminate\\Foundation\\Auth\\VerifiesEmails;\nuse Illuminate\\Http\\Request;\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Auth\\Events\\Verified;\n\nclass VerificationApiController extends Controller\n{\n use VerifiesEmails;\n\n * Mark the authenticated user\xe2\x80\x99s email address as verified.\n\n *\n\n * @param \\Illuminate\\Http\\Request $request\n\n * @return \\Illuminate\\Http\\Response\n\n */\n\n public function verify(Request $request) {\n\n $userID = $request[\'id\'];\n\n $user = User::findOrFail($userID);\n\n $date = date("Y-m-d H:i:s");\n\n $user->email_verified_at = $date; // to enable the \xe2\x80\x9cemail_verified_at field of that user be a current time stamp by mimicing the …Run Code Online (Sandbox Code Playgroud) 我刚刚使用了 laravel-passport,它与 jwt auth 相同。
我想向我的 accessToken 添加一些自定义声明,可以吗?
我想传递
2fa_status => true访问令牌,当使用此访问令牌进行 API 调用时,我也希望来自令牌的声明。
例如 (代币的预期索赔)
{
"aud": "7",
"jti": "123",
"iat": 1568368682,
"nbf": 1568368682,
"exp": 1599991082,
"sub": "2",
"scopes": [],
"2fa_status": false
}
Run Code Online (Sandbox Code Playgroud)
我生成令牌如下:
$tokenResult = $user->createToken('Personal Access Token');
Run Code Online (Sandbox Code Playgroud) 在我的单元测试中,我有一个为其生成令牌的用户:
$tokenString = $this->user->createToken('PHPunit', ['example'])->accessToken;
Run Code Online (Sandbox Code Playgroud)
我之后如何删除该用户的令牌?
我一直在网上查找,但找不到任何方法。让我解释一下,我有一个 API(Laravel Passport on lumen),我用 Postman 测试了它,我用 oauth 获取了我的访问令牌,一切都很好。现在我有另一个 Laravel 应用程序,我想知道如何使用 API 登录来保留所有身份验证内容。我见过很多实际检索 api_token 的应用程序,它们使用“Auth::user()->where('api_token', $token)”。但我发现这是错误的,因为我不希望我的客户端访问数据库,我希望对数据库的每个请求都由 API 处理。那可能吗?
让我有点惊讶的是,我没有找到任何关于使用护照对 Laravel 进行双因素身份验证的实际示例或最佳实践。
由于我想在用户登录 API 并接收其访问令牌时实现此步骤,因此我不确定如何以安全的方式进行处理。
目前流程如下:
username并password点击提交。由于我希望用户能够单独激活或停用 2FA(因为有些客户端可能不想使用它,有些客户端会),所以我会在表中添加一个新列来users存储 2FA 是否启用。
但接下来如何继续呢?如果用户像以前一样定期使用username和进行身份验证password,那么 API 就会知道他是否“需要”第二个身份验证步骤并返回一个标志,以便前端知道显示另一个视图来输入令牌?
感谢您的任何意见:)
我们正在尝试使用 Laravel Passport 实现 SSO 解决方案。关于这个主题已经有一个问题,但我认为这个问题更多的是关于本质问题。
我们的要求是:
根据我对 Oauth2 的理解,系统应该如下工作:
初始登录流程:
请注意,必须重定向到 Passport.com,否则 Safari 和 Chrome 等浏览器在隐身模式下会将 Passport.com 视为第三方域,并且 Cookie 将被阻止。
单点登录流程:
我正在使用lumen-passport进行身份验证和授权。当我解码 JWT 令牌时,我得到的有效负载如下:
{
"aud": "9420abb1-1470-4895-8666-a702b415cb59",
"jti": "03b55ab9d73953207a7e568657a1f83a9c5dcc0162b43fe4816c6086d30d4002b9bd74604ba99ea6",
"iat": 1635781614.447866,
"nbf": 1635781614.447872,
"exp": 1635783414.409659,
"sub": "1b910fc7-54bc-44ef-885b-869b2a095c11",
"scopes": []
}
Run Code Online (Sandbox Code Playgroud)
sub是用户uuid。我想传递自定义数据以及sub如下所示。
{
"aud": "9420abb1-1470-4895-8666-a702b415cb59",
"jti": "03b55ab9d73953207a7e568657a1f83a9c5dcc0162b43fe4816c6086d30d4002b9bd74604ba99ea6",
"iat": 1635781614.447866,
"nbf": 1635781614.447872,
"exp": 1635783414.409659,
"sub": "1b910fc7-54bc-44ef-885b-869b2a095c11",
"custom_data": "this is a custom data.",
"scopes": []
}
Run Code Online (Sandbox Code Playgroud)
我如何在dusterio/lumen-passport或laravel/passport中实现这一点?
我生成令牌如下:
public function authenticateWithPassword(
ServerRequestInterface $request,
string $email,
string $password,
string $scope = ''
): Response {
$newBody = [
'grant_type' => 'password',
'client_id' => $this->clientId,
'client_secret' => …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Laravel Passport设置多个身份验证,但它似乎不支持它.我使用密码授予发出令牌,要求我传递想要访问令牌的用户的用户名/密码.
我有3个auth警卫/提供者设置,总共4个.用户,供应商,管理员和API
其中2个Auths需要访问护照,因此每个用户都需要能够发放令牌.但是,Passport会自动获取API身份验证提供程序,但我希望根据登录的用户进行更改.如果用户确实是用户提供商,那么它是供应商,然后是供应商提供商.
但Passport目前只支持1种用户类型,因此默认为API提供者.
这有什么更好的吗?或者我应该使用基于角色的身份验证.
laravel-passport ×10
laravel ×8
php ×3
oauth-2.0 ×2
api ×1
jwt ×1
laravel-5.8 ×1
lumen ×1
passport-jwt ×1
payload ×1