所以,我正在使用Laravel + Passport,到目前为止工作正常。
但是,我想对护照代码进行一些小改动(好吧,不是在供应商文件夹中,我希望),一旦我要求用户更改密码,以防他第一次登录
所以,我需要的是两件事(我相信):
1 - 如何在oauth / token响应中再添加一个信息?与access_token一起,我想从DB中添加一个需要NewPassword = true / false的列。
2 - 如果needsNewPassword为true,则应用程序将重定向到另一个屏幕,用户将在该屏幕上设置新密码。我将设置新密码,删除needsNewPassword的标志并向用户发回新的access_token。然后,用户将仅使用该access_token。如何重新生成新的access_token?
谢谢你的帮助!若昂
答案 0 :(得分:8)
右,
我回答了我自己的问题,以防有人需要这样做。也许不是最好的方式,但是有效。我做的是:
Route::post('/login', 'Auth\LoginController@apiLogin');
在方法中,您对oauth / token发出请求,并在结果中添加所需的字段。 测试
function apiLogin(Request $request) {
$tokenRequest = $request->create('/oauth/token', 'POST', $request->all());
$request->request->add([
"client_id" => 'your_client_id',
"client_secret" => 'your_client_secret',
"grant_type" => 'password',
"code" => '*',
]);
$response = Route::dispatch($tokenRequest);
$json = (array) json_decode($response->getContent());
$json['new_value'] = '123456';
$response->setContent(json_encode($json));
return $response
}
这对我有用。在我的情况下,我也只有一个应用程序,所以我的client_id,client_secret,grant_type和代码都添加到服务器端。客户端只需要传递用户名(或电子邮件,取决于您使用的是什么)和密码,然后它将获得access_token和我想要发送的其他信息。 希望这也有助于其他人。
干杯, 若昂
答案 1 :(得分:0)
@ joao.sauer 您自己的答案就像一个咒语,但是如果您不需要更多自由,则可以扩展Passport自己的AccessTokenController。
一个简单的例子:
use App\Models\User;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Psr\Http\Message\ServerRequestInterface;
use Response;
class AccessTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController
{
public function issueToken(ServerRequestInterface $request)
{
try {
//get username (default is :email)
$username = $request->getParsedBody()['username'];
//get user
$user = User::where('email', '=', $username)->firstOrFail();
//issuetoken
$tokenResponse = parent::issueToken($request);
//convert response to json string
$content = $tokenResponse->getBody()->__toString();
//convert json to array
$data = json_decode($content, true);
if(isset($data["error"]))
throw new OAuthServerException('The user credentials were incorrect.', 6, 'invalid_credentials', 401);
//add access token to user
$user = collect($user);
$user->put('access_token', $data['access_token']);
return Response::json(array($user));
}
catch (ModelNotFoundException $e) { // email notfound
//return error message
}
catch (OAuthServerException $e) { //password not correct..token not granted
//return error message
}
catch (Exception $e) {
////return error message
}
}
}
Messi89的积分: Laravel Passport - Customize The Token Response
答案 2 :(得分:0)
我找到了一个简单的解决方案,不需要新的请求,控制器或扩展,只需添加参数即可通过应用程序请求和调用issueToken,对于初学者来说可能很有用:
0
还可以添加try ... catch块以处理异常,或在发送给客户端之前添加参数以响应
0