Skip to content

Commit d472bff

Browse files
committed
added cookies and login
1 parent 8f2ffbd commit d472bff

File tree

6 files changed

+158
-4
lines changed

6 files changed

+158
-4
lines changed

Cargo.lock

Lines changed: 50 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
[package]
22
name = "svelte-on-rust"
3-
version = "0.1.0"
3+
version = "0.1.2"
44
authors = ["Sachin Bhutani <[email protected]>"]
55
edition = "2018"
66

77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
1010
rocket = "0.4.2"
11+
serde = "1.0"
12+
serde_json = "1.0"
13+
serde_derive = "1.0"
1114
rocket_contrib = "0.4.2"

client/App.svelte

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77
import About from './pages/About.svelte';
88
import Common from './pages/Common.svelte';
99
import Catcher from './pages/Catcher.svelte';
10+
import Login from './pages/Login.svelte';
11+
import Logout from './pages/Logout.svelte';
12+
import Secure from './pages/Secure.svelte';
13+
import {user} from './store.js';
14+
import {onMount} from 'svelte';
15+
onMount( async() => {
16+
const res = await fetch('/api/checkuser',{credentials: 'same-origin'});
17+
let stateResponse = await res.json();
18+
if (stateResponse.user_id !== '_') {
19+
user.set(stateResponse.user_id);
20+
}else
21+
{
22+
user.set('');
23+
}
24+
});
1025
</script>
1126

1227
<main>
@@ -16,6 +31,9 @@
1631
<Route path="#about"><About></About></Route>
1732
<Route path="#app/common" let:router><Common></Common></Route>
1833
<Route path="#:name" let:router><Catcher></Catcher></Route>
34+
<Route exact path="#login"><Login></Login></Route>
35+
<Route exact path="#logout"><Logout></Logout></Route>
36+
<Route exact path="#secure"><Secure></Secure></Route>
1937
</Router>
2038
<Footer></Footer>
2139
</main>

client/Nav.svelte

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script>
2+
import {user} from './store.js';
23
import {Link} from 'yrv';
4+
35
let isActive = false;
46
function toggleMenu(){
57
isActive = !isActive;
@@ -39,8 +41,32 @@
3941
</div>
4042
</div>
4143
<Link class="navbar-item" href="#app/common?p1=test&p2=3"> Common Route </Link>
44+
{#if $user}<Link class="navbar-item" href="#secure"> Secure Route </Link>{/if}
4245
<Link class="navbar-item" href="#catch-it"> Catch All </Link>
4346
</div>
4447
</div>
4548

49+
<div class="navbar-end">
50+
{#if !$user}
51+
<div class="navbar-item">
52+
<div class="buttons">
53+
<Link class="button is-light" href="#login">
54+
Log in
55+
</Link>
56+
</div>
57+
</div>
58+
{:else}
59+
<div class="navbar-item">
60+
Hi {$user}
61+
</div>
62+
<div class="navbar-item">
63+
<div class="buttons">
64+
<Link class="button is-danger" href="#logout">
65+
Log Out
66+
</Link>
67+
</div>
68+
</div>
69+
{/if}
70+
</div>
71+
4672
</nav>

public/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<link rel='icon' type='image/png' href='/favicon.png'>
1010
<link rel='stylesheet' href='/bulma.min.css'>
1111
<link rel='stylesheet' href='/build/bundle.css'>
12+
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
1213

1314
<script defer src='/build/bundle.js'></script>
1415
</head>

src/main.rs

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33

44
#[macro_use] extern crate rocket;
55
#[macro_use] extern crate rocket_contrib;
6+
#[macro_use] extern crate serde_derive;
67

8+
// use rocket::request::Form;
9+
use rocket::http::{Cookie, Cookies};
710
use rocket_contrib::serve::StaticFiles;
8-
use rocket_contrib::json::JsonValue;
11+
use rocket_contrib::json::{JsonValue,Json};
12+
913

1014
// for base route api
1115
#[get("/")]
@@ -22,6 +26,18 @@ fn json_message() -> JsonValue{
2226
})
2327
}
2428

29+
// check if user is logged in
30+
#[get("/checkuser")]
31+
fn check_user(mut cookies: Cookies) -> JsonValue {
32+
let user_id: String;
33+
match cookies.get_private("session_id") {
34+
Some(cookie) => user_id = cookie.value().to_string(),
35+
None => user_id = '_'.to_string(),
36+
}
37+
json!({"user_id": user_id})
38+
}
39+
40+
// common client and server route
2541
#[get("/common", rank = 1)]
2642
fn common() -> JsonValue{
2743
json!({
@@ -31,9 +47,50 @@ fn common() -> JsonValue{
3147
})
3248
}
3349

50+
// User struct for login
51+
#[derive(Serialize, Deserialize)]
52+
struct User {
53+
username: String,
54+
password: String
55+
}
56+
57+
#[post("/login", format = "json", data = "<user>")]
58+
fn login_user(mut cookies: Cookies<'_>, user: Json<User>) -> JsonValue{
59+
// should be replaced with databased logic and encrypted passwords
60+
if user.username == user.password {
61+
cookies.add_private(Cookie::new("session_id", user.into_inner().username));
62+
json!({ "result" : "success",
63+
"messge" : "login successfull"
64+
})
65+
}else {
66+
json!({ "result" : "error",
67+
"message": "Invalid Username/Password"
68+
})
69+
}
70+
}
71+
72+
#[get("/logout")]
73+
fn logout_user(mut cookies: Cookies<'_>) -> JsonValue{
74+
cookies.remove_private(Cookie::named("session_id"));
75+
json!({ "result" : "success",
76+
"messge" : "logout successfull"
77+
})
78+
}
79+
80+
//secured area content
81+
#[get("/secure")]
82+
fn secure_content(mut cookies: Cookies<'_>) -> JsonValue{
83+
// fectch private date for the user based on session_id
84+
match cookies.get_private("session_id"){
85+
Some(_cookie)=> json!({ "result": "success", "message": "this is your ultra secret private data"}),
86+
None => json!( {"result" : "error", "message": "no cookies for you"}),
87+
}
88+
}
89+
3490
fn mount_rocket() -> rocket::Rocket{
3591
rocket::ignite()
36-
.mount("/api",routes![api,json_message])
92+
.mount("/api",routes![api,json_message,check_user,secure_content])
93+
.mount("/auth",routes![login_user,logout_user])
3794
.mount("/app",routes![common])
3895
.mount("/", StaticFiles::from(concat!(env!("CARGO_MANIFEST_DIR"), "/public")))
3996

0 commit comments

Comments
 (0)