dpy15285 2018-06-09 09:05
浏览 61

自定义用户(客户)表密码重置不起作用 - Laravel(使用API​​)

I do have trouble in setting password reset facility for custom user table (suppose 'customers' table). It was successful to generate a token for password reset but unable to do the reset because of Laravel considering its default table 'users', not the table I suppose to do reset. Changing default table users to customers in Config\Auth.php generate validation error

Passwords must be at least six characters and match the confirmation.

I just copy/pasting what I did so far

<?php
/*
Code Done by Arun
*/
namespace App\Http\Controllers\API\ResetPassword;

use App\Http\Controllers\API\Controller;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Support\Facades\Password;
use App\Model\Customer;
use Laravel\Passport\Client;
use Illuminate\Support\Facades\Auth;


class ResetPasswordController extends Controller
{
    use ResetsPasswords;

    public function __construct()
    {
        $this->middleware('api');
    }
    protected function guard()
    {
        return Auth::guard('api');
    }
    public function ResetPassword(Request $request)
    {
        $v = validator($request->only('email', 'token', 'password','confirm_password'), [
            'token' => 'required|string|max:255',
            'email' => 'required|string|email|max:255',
            'password' => 'required|string',
            'confirm_password' => 'required|string|min:6',
            ]);
        if ($v->fails()) {
            return response()->json(["error"=>$v->errors()->all()], 400);
        }
        else
        {
            $response = $this->broker()->reset(
                $this->credentials($request), function ($user, $password) {
                    $this->resetPassword($user, $password);
                });
        }

        return $response == Password::PASSWORD_RESET
        ? $this->sendResetResponse($response)
        : $this->customResetFailedResponse($request, $response);

        // $client = Client::where('password_client', 1)->first();
        // $request->request->add([
        //  'grant_type'    => 'password',
        //  'client_id'     => $client->id,
        //  'client_secret' => $client->secret,
        //  'username'      => $request->email,
        //  'password'      => $request->password,
        //  'scope'         => null,
        //  ]);

  //       // Fire off the internal request. 
        // $proxy = Request::create(
        //  'oauth/token',
        //  'POST'
        //  );
        // return $response ;
    }

}

Any Laravel expert can help me with the problem?

  • 写回答

1条回答 默认 最新

  • doutuo4285 2018-06-18 08:49
    关注

    Im finally able to figure this out, im just posting answer may help others come across the same problem.

    <?php
    
    namespace App\Http\Controllers\API\Auth;
    
    use App\Http\Controllers\API\Controller;
    use Illuminate\Http\Request;
    use Illuminate\Foundation\Auth\ResetsPasswords;
    use Illuminate\Support\Facades\Password;
    use App\Model\Customer;
    
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Auth;
    use GuzzleHttp\Client;
    use DB;
    class ResetPasswordController extends Controller
    {
        use ResetsPasswords;
        protected $confirmEmail = false;
        public function __construct()
        {
    
        }
    
        public function resetPasswordCustomer(Request $request)
        {
            //Custome password reset mail has done in customer model
            $v = validator($request->only('token', 'password','password_confirmation'), [
                'token' => 'required|string|max:255',
                'password' => 'required|string',
                'password_confirmation' => 'required|string|min:6',
                ]);
            if ($v->fails()) {
                return response()->json(["error"=>$v->errors()->all()], 400);
            }
            else
            {
                $request->merge(['email'=> $this->checkTokenAgainstHashedValue($request->token)]);//Add new property to request.. 
                $response = $this->broker()->reset(
                    $this->credentials($request), function ($user, $password) {
                        $this->resetPassword($user, $password);
                    });
            }
            return $response == Password::PASSWORD_RESET
            ? $this->authToken($request)
            : $this->customResetFailedResponse($request, $response);
    
            return $response ;
        }
        protected function checkTokenAgainstHashedValue($token)
        {
            $resetTable = DB::table('password_reset_customers')->select('token','email')->get();
            foreach ($resetTable as $value) {
                if (Hash::check($token, $value->token)) {
                    return $value->email;
                }
            }
            return null;
        }
        protected function authToken(Request $request)
        {
            $http = new Client();
    
            $response = $http->post('http://abcd.com/oauth/token', [
                'form_params' => [
                'grant_type' => 'password',
                'client_id' => 2,
                'client_secret' =>'qazrxGbDwrwbYXwbEbbkUFNO1zGB3eFYQN3AbG3m',
                'username' => Auth::user()->email,
                'password' =>  $request->password,
                'scope' => '',
                ],
                ]);
    
            return json_decode((string) $response->getBody(), true);
    
        }
        public function broker()
        {
            return Password::broker('customers');
        }
    
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分