Выпустите токен и обновите токен: Laravel / jwt - PullRequest
0 голосов
/ 14 февраля 2019

Я нахожусь в процессе разработки API, у меня проблема с обновлением токена, в данный момент я делаю контроллер, который получает запрос на обновление с действительным токеном, и контроллер создает новый токен и помещает последний вчерный список, проблема в том, что мобильный разработчик узнает время истечения токена. Я вижу, что отправлять в любое время непрактично, чтобы проверить действительность токена, потому что контроллер, который я использую, не может обновить токен с истекшим сроком действия.например: срок действия моего токена 60 минут, если разработчик мобильных приложений не делает запрос в течение этих 60 минут, он отключается от приложения, поскольку токен истекает и он не может обновиться, но если он отправляет запросы на обновление токена до этого60 минут все пройдет хорошо.у меня вопрос: могу ли я сгенерировать два токена, первый нормальный токен и второй, когда разработчик отправляет рекет, и он получает запрос 401, он использует токен обновления, чтобы сгенерировать еще два токена, и поэтому он остается подключенным, пока не выполнит ручное отключение

мой контроллер AUthcontroller:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Tymon\JWTAuth\Contracts\Providers\Auth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTAuth\Facades\JWTAuth;
use Validator, Hash;
use Illuminate\Support\Facades\Password;
use Carbon\Carbon;
use Config;
use Artisan;
class AuthController extends Controller
{
    /**
     * API Register
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function register( Request $request){
        $validator = Validator::make($request -> all(),[
            'email' => 'required|string|email|max:255|unique:users',
            'username' =>'required',
            'tel' => 'required',
            'name' => 'required',
            'lastname' => 'required',
            'adress' => 'required',
            'password'=> 'required'
        ]);

        if ($validator -> fails()) {
            # code...
            return response()->json($validator->errors());

        }

        $user_data = User::create([
            'name' => $request->get('name'),
            'email' => $request->get('email'),
            'tel' => $request->get('tel'),
            'username' => $request->get('username'),
            'lastname' => $request->get('lastname'),
            'adress' => $request->get('adress'),
            'password'=> bcrypt($request->get('password'))
        ]);
        $user = User::first();
        $token = JWTAuth::fromUser($user);



        return response()->json(['success'=> true,'token'=>compact('token'),'Data'=>$user_data, 'message'=> 'Thanks for signing up']);


    }

    /**
     * API Login, on success return JWT Auth token
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');
        $rules = [
            'email' => 'required|email',
            'password' => 'required',
        ];
        $validator = Validator::make($credentials, $rules);
        if($validator->fails()) {
            return response()->json(['success'=> false, 'error'=> $validator->messages()], 401);
        }
        try {
            // attempt to verify the credentials and create a token for the user
            $time = isset($request->time) ? $request->time : Config::get('jwt.ttl');
            // print_r(Carbon::now()->addSeconds($time)->timestamp);
            Config::set('jwt.ttl', $time);
            Artisan::call('config:clear');
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['success' => false, 'error' => 'We cant find an account with this credentials. Please make sure you entered the right information and you have verified your email address.'], 404);
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['success' => false, 'error' => 'Failed to login, please try again.'], 500);
        }
        // all good so return the token
       // $refresh_token = auth('api')->refresh($token)
     //  $token = Auth::refresh($token);
      //  $token = JWTAuth::refresh($token);

        return response()->json(['success' => true, 'data'=> [ 'token' => $token ]], 200);
    }
    /**
     * Log out
     * Invalidate the token, so user cannot use it anymore
     * They have to relogin to get a new token
     *
     * @param Request $request
     */
    public function logout(Request $request) {
        try {
            JWTAuth::invalidate($request->header('Authorization'));
            return response()->json(['success' => true, 'message'=> "You have successfully logged out."]);
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['success' => false, 'error' => 'Failed to logout, please try again.'], 500);
        }
    }
    public function token($token = null){
        $token = $token ? $token : JWTAuth::getToken();
        if(!$token){
            throw new BadRequestHtttpException('Token not provided');
        }
        try{
            $token = JWTAuth::refresh($token);
        }catch(TokenInvalidException $e){
            throw new AccessDeniedHttpException('The token is invalid');
        }
        return response()->json(['success' => true, 'data' => $token], 200);
    }
    public function recover(Request $request)
    {
        $user = User::where('email', $request->email)->first();
        if (!$user) {
            $error_message = "Your email address was not found.";
            return response()->json(['success' => false, 'error' => ['email'=> $error_message]], 401);
        }
        try {
            Password::sendResetLink($request->only('email'), function (Message $message) {
                $message->subject('Your Password Reset Link');
            });
        } catch (\Exception $e) {
            //Return with error
            $error_message = $e->getMessage();
            return response()->json(['success' => false, 'error' => $error_message], 401);
        }
        return response()->json([
            'success' => true, 'data'=> ['message'=> 'A reset email has been sent! Please check your email.']
        ]);
    }
    public function changePassword(Request $request)
    {
        $inputs = $request->only('oldpassword','newpassword');
        $rules = [
            'oldpassword' => 'required',
            'newpassword' => 'required',
        ];
        $validator = Validator::make($inputs, $rules);
        if($validator->fails()) {
            return response()->json(['success'=> false, 'error'=> $validator->messages()], 401);
        }
        try {
            $authuser = auth()->user();
            if (! Hash::check($request->oldpassword, $authuser->password) ){
                return response()->json(['success' => false, 'error' => 'You enter wrong old password'], 404);
            }
            $updated = User::where('email', $authuser->email)->update(['password' =>  Hash::make($request->newpassword)]);
            if($updated){
                $gettoken = $this->token($request->header('Authorization'));
                $token = $gettoken->original['data'];
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['success' => false, 'error' => 'Failed to change password, please try again.'], 500);
        }
        return response()->json(['success' => true, 'data'=> [ 'message' =>'Password successfully changed',"token"=>$token]], 200);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...