|
@@ -0,0 +1,189 @@
|
|
|
+<?php namespace Laravel\Auth\Login\Drivers;
|
|
|
+
|
|
|
+use Laravel\Str;
|
|
|
+use Laravel\Cookie;
|
|
|
+use Laravel\Session;
|
|
|
+
|
|
|
+abstract class Driver {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The user currently being managed by the driver.
|
|
|
+ *
|
|
|
+ * @var mixed
|
|
|
+ */
|
|
|
+ public $user;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The current value of the user's token.
|
|
|
+ *
|
|
|
+ * @var string|null
|
|
|
+ */
|
|
|
+ public $token;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Create a new login auth driver instance.
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function __construct()
|
|
|
+ {
|
|
|
+ if (Session::started())
|
|
|
+ {
|
|
|
+ $this->token = Session::get($this->token());
|
|
|
+ }
|
|
|
+
|
|
|
+ // If a token did not exist in the session for the user, we will attempt
|
|
|
+ // to load the value of a "remember me" cookie for the driver, which
|
|
|
+ // serves as a long-lived client side authenticator for the user.
|
|
|
+ if (is_null($this->token))
|
|
|
+ {
|
|
|
+ $this->token = $this->recall();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Determine if the user is logged in.
|
|
|
+ *
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function check()
|
|
|
+ {
|
|
|
+ return ! is_null($this->user());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get the current user of the application.
|
|
|
+ *
|
|
|
+ * If the user is a guest, null should be returned.
|
|
|
+ *
|
|
|
+ * @return mixed|null
|
|
|
+ */
|
|
|
+ abstract public function user();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Attempt to log a user into the application.
|
|
|
+ *
|
|
|
+ * @param dynamic $arguments
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ abstract public function attempt();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Login the user assigned to the given token.
|
|
|
+ *
|
|
|
+ * The token is typically a numeric ID for the user.
|
|
|
+ *
|
|
|
+ * @param string $token
|
|
|
+ */
|
|
|
+ public function login($token)
|
|
|
+ {
|
|
|
+ $this->store($token);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Log the user out of the driver's auth context.
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function logout()
|
|
|
+ {
|
|
|
+ $this->user = null;
|
|
|
+
|
|
|
+ $this->cookie($this->recaller(), null, -2000);
|
|
|
+
|
|
|
+ Session::forget($this->token());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Store a user's token in the session.
|
|
|
+ *
|
|
|
+ * @param string $token
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ protected function store($token)
|
|
|
+ {
|
|
|
+ Session::put($this->token(), $token);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Store a user's token in a long-lived cookie.
|
|
|
+ *
|
|
|
+ * @param string $token
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ protected function remember($token)
|
|
|
+ {
|
|
|
+ $token = Crypter::encrypt($token.'|'.Str::random(40));
|
|
|
+
|
|
|
+ $this->cookie($this->recaller(), $token, Cookie::forever);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Attempt to find a "remember me" cookie for the user.
|
|
|
+ *
|
|
|
+ * @return string|null
|
|
|
+ */
|
|
|
+ protected function recall()
|
|
|
+ {
|
|
|
+ $cookie = Cookie::get($this->recaller());
|
|
|
+
|
|
|
+ // By default, "remember me" cookies are encrypted and contain the user
|
|
|
+ // token as well as a random string. If it exists, we'll decrypt it
|
|
|
+ // and return the first segment, which is the user's ID token.
|
|
|
+ if ( ! is_null($cookie))
|
|
|
+ {
|
|
|
+ return head(explode('|', Crypter::decrypt($cookie)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Store an authentication cookie.
|
|
|
+ *
|
|
|
+ * @param string $name
|
|
|
+ * @param string $value
|
|
|
+ * @param int $minutes
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ protected function cookie($name, $value, $minutes)
|
|
|
+ {
|
|
|
+ // When setting the default implementation of an authentication
|
|
|
+ // cookie we'll use the same settings as the session cookie.
|
|
|
+ // This typically makes sense as they both are sensitive.
|
|
|
+ $config = Config::get('session');
|
|
|
+
|
|
|
+ extract($config);
|
|
|
+
|
|
|
+ Cookie::put($name, $minutes, $token, $path, $domain, $secure);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get session key name used to store the token.
|
|
|
+ *
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ protected function token()
|
|
|
+ {
|
|
|
+ return $this->name().'_login';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get the name used for the "remember me" cookie.
|
|
|
+ *
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ protected function recaller()
|
|
|
+ {
|
|
|
+ return $this->name().'_remember';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get the name of the driver in a storage friendly format.
|
|
|
+ *
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ protected function name()
|
|
|
+ {
|
|
|
+ return strtolower(str_replace('\\', '_', get_class($this)));
|
|
|
+ }
|
|
|
+
|
|
|
+}
|