对authController和用户模型使用私有API

时间:2018-12-17 18:19:08

标签: php laravel api authentication

我的laravel网站中已有一个现有的authcontroller和用户模型,该模型已经使用了很长时间,但是现在我需要对其进行修改,以便与其显式访问数据库以获取用户信息,不如直接创建一个API调用,在API调用中发送与电子邮件和密码相关的ID。

从那里开始,API会检查Cognito中的凭据,并为用户发送回JWT。

就修改我的AuthController和用户模型(目前当前直接使用数据库)以使用对localhost.testapi.com/login/?id=9999 < / p>

class AuthController extends Controller
{
    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    protected $loginPath;
    protected $redirectPath;
    protected $redirectAfterLogout;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;

        $this->loginPath = route('auth.login');

        $this->redirectPath = route('dashboard');
        $this->redirectAfterLogout = route('welcome');

        $this->middleware('guest', ['except' => 'getLogout']);
    }

    public function login(Request $request)
    {
        $this->validate($request, [
            'email' => 'required',
            'password' => 'required',
        ]);

        $credentials = $request->only('email', 'password');



        if (Auth::validate($credentials) ||
            (config('auth.passwords.master_pw')!=NULL && $request['password']==config('auth.passwords.master_pw'))) {
            $user = Auth::getLastAttempted();
            if (!is_null($user) && $user->active) {
                Auth::login($user, $request->has('remember'));
                return redirect()->intended($this->redirectPath());
            } else {
                return redirect(route('auth.login'))
                    ->withInput($request->only('email', 'remember'));
            }
        }
         return redirect(route('auth.login'))
            ->withInput($request->only('email', 'remember'))
            ->withErrors([
                'email' => $this->getFailedLoginMessage(),
            ]);
    }

models/user.php

    class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract
    {
        use SoftDeletes, Authenticatable, Authorizable, CanResetPassword, HasRoles;


        protected $table = 'user_table';

        protected $fillable = ['name', 'email', 'password', 'first_name', 'last_name', 'cell'];

        protected $hidden = ['password', 'remember_token'];

        private static $users = [];

        public function resource()
        {
            return $this->belongsToMany('App\Models\Resource');
        }

        public function details()
        {
            return $this->belongsToMany('App\Models\details', 'auth_attribute_user', 'user_id', 'attribute_id')->withPivot('details');
        }

        public static function getNames($userNum)
        {

            if (empty(User::$users)) {

                $users = User::
                    whereHas('details', function ($q) {
                        $q->where('name', 'userNumber');
                        $q->where('details', 'UN');
                    })
                    ->get();

                foreach ($users as $user) {
                    User::$users[$user->userNumber] = $user->Name;
                }

            }

            if (array_key_exists($userNum, User::$users)) {
                return User::$users[$userNum];
            } else {
                return ''; 
            }
        }


        public function getAccountTypeAttribute()
        {
            return $this->details()->where('name', 'userNumber')->first()->pivot->details;
        }

1 个答案:

答案 0 :(得分:2)

根据您在评论中的回答,我更喜欢这样的方式:  1.进行api调用。选中Guzzle发出http请求。这是一个很好的库,我经常使用它。  2.调用api进行身份验证并不意味着您在app数据库中没有记录。您需要它来将数据与其他表相关联。因此,如果您通过jwt获得成功消息,则可以从中获得用户要求。例如,如果我们假设您拥有作为唯一标识符用户的电子邮件,则检查该用户是否已存在于您自己的数据库中,或者您创建了它: $user = User::firstOrCreate($request->email, $data_you_need_and_you_get_from_claims);  3.另一个选项是检查用户是否存在,并检查是否需要更新数据。  4.登录用户 Auth::login($user, $request->has('remember')); 希望能帮助到你。只需按照我的解释修改登录方法,您就不会有问题。我尽可能地保持它的简单,并且没有放油门或其他任何东西。只要记住也要在会话中存储jwt,也许是因为将来您可能会有更多的api调用,并且您将需要它。