diff --git a/src/app/Http/Controllers/API/EntitlementsController.php b/src/app/Http/Controllers/API/EntitlementsController.php index d402eeee..1339a035 100644 --- a/src/app/Http/Controllers/API/EntitlementsController.php +++ b/src/app/Http/Controllers/API/EntitlementsController.php @@ -1,90 +1,90 @@ json(['status' => 'success']); + } + + /** + * Validation of the verification code. + * + * @param Illuminate\Http\Request HTTP request + * + * @return \Illuminate\Http\JsonResponse JSON response + */ + public function verify(Request $request) + { + // TODO: validate the code + // TODO: return user name and email/phone from the codes database on success + + return response()->json(['status' => 'success']); + } + + /** + * Finishes the signup process by creating the user account. + * + * @param Illuminate\Http\Request HTTP request + * + * @return \Illuminate\Http\JsonResponse JSON response + */ + public function register(Request $request) + { + $v = Validator::make( + $request->all(), + [ + 'email' => 'required|email|unique:users', + 'password' => 'required|min:3|confirmed', + ] + ); + + if ($v->fails()) { + return response()->json(['status' => 'error', 'errors' => $v->errors()], 422); + } + + $user = \App\User::create( + [ + 'email' => $request->email, + 'password' => $request->password, + ] + ); + + $token = auth()->login($user); + + return $this->respondWithToken($token); + } + + /** + * Get the token array structure. + * + * @param string $token Respond with this token. + * + * @return \Illuminate\Http\JsonResponse JSON response + */ + protected function respondWithToken($token) + { + return response()->json([ + 'access_token' => $token, + 'token_type' => 'bearer', + 'expires_in' => $this->guard()->factory()->getTTL() * 60, + ]); + } +} diff --git a/src/app/Http/Controllers/API/UsersController.php b/src/app/Http/Controllers/API/UsersController.php index 831ea916..2ba815fa 100644 --- a/src/app/Http/Controllers/API/UsersController.php +++ b/src/app/Http/Controllers/API/UsersController.php @@ -1,190 +1,164 @@ middleware('auth:api', ['except' => ['login', 'register']]); + $this->middleware('auth:api', ['except' => ['login']]); } /** * Display a listing of the resources. * * The user themself, and other user entitlements. * * @return \Illuminate\Http\Response */ public function index() { $user = Auth::user(); if (!$user) { return response()->json(['error' => 'unauthorized'], 401); } $result = [$user]; $user->entitlements()->each( function ($entitlement) { $result[] = User::find($entitlement->user_id); } ); return response()->json($result); } /** * Get the authenticated User * * @return \Illuminate\Http\JsonResponse */ public function info() { return response()->json($this->guard()->user()); } /** * Get a JWT token via given credentials. * * @param \Illuminate\Http\Request $request The API request. * * @return \Illuminate\Http\JsonResponse */ public function login(Request $request) { $credentials = $request->only('email', 'password'); if ($token = $this->guard()->attempt($credentials)) { return $this->respondWithToken($token); } return response()->json(['error' => 'Unauthorized'], 401); } /** * Log the user out (Invalidate the token) * * @return \Illuminate\Http\JsonResponse */ public function logout() { $this->guard()->logout(); return response()->json(['message' => 'Successfully logged out']); } /** * Refresh a token. * * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken($this->guard()->refresh()); } - public function register(Request $request) - { - $v = Validator::make( - $request->all(), - [ - 'email' => 'required|email|unique:users', - 'password' => 'required|min:3|confirmed', - ] - ); - - if ($v->fails()) { - return response()->json(['status' => 'error', 'errors' => $v->errors()], 422); - } - - $user = \App\User::create( - [ - 'email' => $request->email, - 'password' => $request->password, - ] - ); - - $token = auth()->login($user); - - return $this->respondWithToken($token); - } - /** * Get the token array structure. * * @param string $token Respond with this token. * * @return \Illuminate\Http\JsonResponse */ protected function respondWithToken($token) { return response()->json( [ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => $this->guard()->factory()->getTTL() * 60 ] ); } /** * Display the specified resource. * * @param int $id The account to show information for. * * @return \Illuminate\Http\Response */ public function show($id) { $user = Auth::user(); if (!$user) { return abort(403); } $result = false; $user->entitlements()->each( function ($entitlement) { if ($entitlement->user_id == $id) { $result = true; } } ); if ($user->id == $id) { $result = true; } if (!$result) { return abort(404); } return \App\User::find($id); } /** * Get the guard to be used during authentication. * * @return \Illuminate\Contracts\Auth\Guard */ public function guard() { return Auth::guard(); } } diff --git a/src/app/Http/Controllers/API/WalletsController.php b/src/app/Http/Controllers/API/WalletsController.php index 63121e6f..a6d4d026 100644 --- a/src/app/Http/Controllers/API/WalletsController.php +++ b/src/app/Http/Controllers/API/WalletsController.php @@ -1,95 +1,95 @@

Step 1/3

Sign up to start your free month.

- +
- +

Step 2/3

We sent out a confirmation code to PHONE/EMAIL. Enter the code we sent you, or click the link in the message.

- +

Step 3/3

Create your Kolab identity (you can choose additional addresses later).

- + @ -
- +
- +
diff --git a/src/resources/vue/js/routes.js b/src/resources/vue/js/routes.js index 54710e02..1540e471 100644 --- a/src/resources/vue/js/routes.js +++ b/src/resources/vue/js/routes.js @@ -1,69 +1,69 @@ import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) import DashboardComponent from '../components/Dashboard' import Error404Component from '../components/404' import LoginComponent from '../components/Login' import LogoutComponent from '../components/Logout' import RegisterComponent from '../components/Register' import store from './store' const routes = [ { path: '/', redirect: { name: 'login' } }, { path: '/dashboard', name: 'dashboard', component: DashboardComponent, meta: { requiresAuth: true } }, { path: '/login', name: 'login', component: LoginComponent }, { path: '/logout', name: 'logout', component: LogoutComponent }, { - path: '/register', + path: '/register/:code?', name: 'register', component: RegisterComponent }, { path: '*', component: Error404Component } ] const router = new VueRouter({ mode: 'history', routes }) router.beforeEach((to, from, next) => { // check if the route requires authentication and user is not logged in if (to.matched.some(route => route.meta.requiresAuth) && !store.state.isLoggedIn) { // redirect to login page next({ name: 'login' }) return } // if logged in redirect to dashboard if (to.path === '/login' && store.state.isLoggedIn) { next({ name: 'dashboard' }) return } next() }) export default router diff --git a/src/routes/api.php b/src/routes/api.php index 4a9c4e2e..fb5d13ff 100644 --- a/src/routes/api.php +++ b/src/routes/api.php @@ -1,40 +1,43 @@ 'api', 'prefix' => 'auth' ], function ($router) { Route::get('info', 'API\UsersController@info'); Route::post('login', 'API\UsersController@login'); Route::post('logout', 'API\UsersController@logout'); Route::post('refresh', 'API\UsersController@refresh'); - Route::post('register', 'API\UsersController@register'); + + Route::post('register/init', 'API\SignupController@init'); + Route::post('register/verify', 'API\SignupController@verify'); + Route::post('register', 'API\SignupController@register'); } ); Route::group( [ 'middleware' => 'auth:api', 'prefix' => 'v4' ], function () { Route::apiResource('entitlements', API\EntitlementsController::class); Route::apiResource('users', API\UsersController::class); Route::apiResource('wallets', API\WalletsController::class); } ); diff --git a/src/routes/web.php b/src/routes/web.php index d59d4324..dfed9cf5 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -1,23 +1,23 @@