obsidian/MyObsidianVault/WebDev/2 CodeIgniter/API Project setup/02.) Create Auth Controller.md
2024-12-08 09:19:03 +01:00

2.6 KiB

php spark make:controller Api/Auth --suffix --restful

Routes.php

//Get
$routes->get("logout", "AuthController::logout", ["filter" => "apiauth"]);

Api/AuthController.php

use CodeIgniter\Restful\ResourceController;
use CodeIgniter\Shield\Models\UserModel;
use CodeIgniter\Shield\Entities\User;

class AuthController extends ResourceController
{
	//Post
	public function register()
	{
		$rules = [
			"username" => "required|is_unique[users.username]", 
			"email" => "required|valid_email|is_unique[auth_identities.secret]",  // gets written to secret field in user table
			"password" => "required" // gets written to secret 2 field in user table
		];

		if (!$this->validate($rules)) {
			return $this->respondCreated([
				"status" => false,
				"message"  => $this->validator->getErrors(),
				"data" => []
			]
		);
			
		$um = new UserModel(); // coming from Shield
		$userEntity = new User([
			"username" => $this->request->getVar("username"),
			"email" => $this->request->getVar("email"),
			"password" => $this->request->getVar("password")
		]);
		$um->save($userEntity);
		
		return $this->respondCreated( [
			"status" => true,
			"message" => "User saved successfully",
			"data" => []
		]);
	}

	//////////////////////////////////////

	// Post
	public function login()
	{
		if(auth()->loggedIn()){
			auth()->logout();
		}
	
		$rules = [
			"email" => "required|valid_email",
			"password" => "required"
		];
	
		if (!$this->validate($rules)) {
			return $this->respondCreated([
				"status" => false,
				"message" => $this->validator->getErrors(),
				"data" => []
		]);
	
		// success
		$credentials = [
			"email" => $this->request->getVar("email"),
			"password" => $this->request->getVar("password")
		];
	
		$loginAttempt = auth()->attempt($credentials);
		if (!$loginAttempt->isOK()) {
			return $this->respondCreated([
					"status" => false,
					"message" => "Invalid login details",
					"data" => []
			]);
			
		// We have a valid data set
		$um = new UserModel();
		$userData = $um->findById(auth()->id());
		$token = $userData->generateAccessToken("thisismysecretkey");
		$auth_token = $token->raw_token; // Only available after generation
	
		return $this->respondCreated( [
			"status" => true,
			"message" => "User logged in successfully",
			"data" => [
				"token" => $auth_token
			] );
	}

	////////////////////////

	public function logout() {
		auth()->logout();
		auth()->user()->revokeAllAccessTokens();
	
		return $this->respondCreated([
			"status" => true,
			"message" => "User logged out successfully",
			"data" => []
		]);
	}
}