-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeed.xml
More file actions
203 lines (199 loc) · 37.1 KB
/
feed.xml
File metadata and controls
203 lines (199 loc) · 37.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title>Tales of a developer</title>
<subtitle>A place for things that I've found interesting.</subtitle>
<link href="https://luisjg.dev/feed.xml" rel="self" />
<link href="https://luisjg.dev/" />
<updated>2019-07-25T00:00:00Z</updated>
<id>https://luisjg.dev/</id>
<author>
<name>luisjg</name>
</author>
<entry>
<title>How to re-purpose Laravel's forgot password functionality</title>
<link href="https://luisjg.dev/blog/how-to-repurpose-laravels-forgot-password/" />
<updated>2019-07-25T00:00:00Z</updated>
<id>https://luisjg.dev/blog/how-to-repurpose-laravels-forgot-password/</id>
<content type="html"><center>
<img src="https://res.cloudinary.com/dfhliq7vp/image/upload/f_auto,q_auto:eco/luisjg/avif/1200px-LaravelLogo.avif" width="17%" alt="Laravel logo" title="Laravel logo">
</center>
<h2>Introduction</h2>
<hr>
<p>Ever since Laravel 5.0, I've been consistently impressed with its in-built features. A standout is its rapid project setup with user authentication. Here’s a look:</p>
<pre class="language-bash"><code class="language-bash"> $ <span class="token function">composer</span> create-project --prefer-dist laravel/laravel <span class="token operator">&lt;</span>project-name<span class="token operator">></span>
$ <span class="token builtin class-name">cd</span> <span class="token operator">&lt;</span>project-name<span class="token operator">></span>
$ php artisan migrate
$ php artisan make:auth</code></pre>
<p>With this, you have an authentication system. And while Laravel has its defaults, what if you need customization?</p>
<h2>The Challenge</h2>
<hr>
<p>How can we create a password-less user system with just an email and name? Let's dig in.</p>
<h2>The Solution</h2>
<hr>
<p>Rather than reinventing the wheel, we're using Laravel's default approach as if it's a password reset.</p>
<p><strong>Application Flow:</strong></p>
<ol>
<li>Collect from the user their <code>first_name</code>, <code>last_name</code>, and <code>email</code>.</li>
<li>Generate a temporary password and an expiration token. Store one key in the <code>password_resets</code> table.</li>
<li>Email the user with a link to set their password.</li>
</ol>
<p>We'll modify the default users table migration to fit our needs:</p>
<pre class="language-php"><code class="language-php"> <span class="token class-name static-context">Schema</span><span class="token operator">::</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">Blueprint</span> <span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$table</span><span class="token operator">-></span><span class="token function">bigIncrements</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'id'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'first_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'last_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">unique</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-></span><span class="token keyword type-declaration">string</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'password'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-></span><span class="token function">timestamps</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Next, set up core functionalities:</p>
<ul>
<li><strong>Generate a Hashed Key and Token:</strong></li>
</ul>
<pre class="language-php"><code class="language-php"> <span class="token comment">/**
* Create a hashed key for the user.
*
* @return string
*/</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">createHashedKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">config</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'app.key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name static-context">Str</span><span class="token operator">::</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'base64:'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">hash_hmac</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'sha256'</span><span class="token punctuation">,</span> <span class="token class-name static-context">Str</span><span class="token operator">::</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token number">40</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$key</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token variable">$key</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<pre class="language-php"><code class="language-php"> <span class="token comment">/**
* Create a new token for the user.
*
* @return string
*/</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">createNewToken</span><span class="token punctuation">(</span><span class="token variable">$hashedKey</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token class-name static-context">Hash</span><span class="token operator">::</span><span class="token function">make</span><span class="token punctuation">(</span><span class="token variable">$hashedKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<ul>
<li><strong>Token Comparison &amp; Deletion:</strong></li>
</ul>
<pre class="language-php"><code class="language-php"> <span class="token comment">/**
* @param $token the emailed token
* @param $hashedKey the saved key on the password_resets
* @return boolean
*/</span>
<span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">compareTokens</span><span class="token punctuation">(</span><span class="token variable">$token</span><span class="token punctuation">,</span> <span class="token variable">$hashedKey</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token class-name static-context">Hash</span><span class="token operator">::</span><span class="token function">check</span><span class="token punctuation">(</span><span class="token variable">$token</span><span class="token punctuation">,</span> <span class="token variable">$hashedKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<pre class="language-php"><code class="language-php"> <span class="token comment">/**
* Delete expired tokens.
*
* @return void
*/</span>
<span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">deleteExpiredTokens</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$expiredAt</span> <span class="token operator">=</span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">subSeconds</span><span class="token punctuation">(</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'app.token_expiration_date'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name static-context">PasswordReset</span><span class="token operator">::</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'created_at'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'&lt;'</span><span class="token punctuation">,</span> <span class="token variable">$expiredAt</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
* Delete a token record by user email.
*
* @param $email
* @return void
*/</span>
<span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">delete</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token class-name static-context">PasswordReset</span><span class="token operator">::</span><span class="token function">whereEmail</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>Implementation becomes straightforward. We create our token and keys:</p>
<pre class="language-php"><code class="language-php"> <span class="token punctuation">{</span>
<span class="token comment">//...</span>
<span class="token variable">$hashedKey</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">createHashedKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$token</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">createNewToken</span><span class="token punctuation">(</span><span class="token variable">$hashedKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//...</span></code></pre>
<p>Then save the generated token to our <code>password_resets</code> table as well as the user account with their temporary password:</p>
<pre class="language-php"><code class="language-php"> <span class="token comment">//..</span>
<span class="token comment">// $input comes from a validated Illuminate\Http\Request object.</span>
<span class="token comment">// A database transaction saves us from having incomplete data being stored.</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name static-context">DB</span><span class="token operator">::</span><span class="token function">transaction</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$token</span><span class="token punctuation">,</span> <span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name static-context">PasswordReset</span><span class="token operator">::</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
<span class="token string single-quoted-string">'email'</span> <span class="token operator">=></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'token'</span> <span class="token operator">=></span> <span class="token variable">$token</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'created_at'</span> <span class="token operator">=></span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">toDateTimeString</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name static-context">User</span><span class="token operator">::</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
<span class="token string single-quoted-string">'first_name'</span> <span class="token operator">=></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'first_name'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'last_name'</span> <span class="token operator">=></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'last_name'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'email'</span> <span class="token operator">=></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'password'</span> <span class="token operator">=></span> <span class="token class-name static-context">Str</span><span class="token operator">::</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// catch exception</span>
<span class="token punctuation">}</span>
<span class="token comment">//..</span></code></pre>
<p>Finally we send the user an email containing the hashed token:</p>
<pre class="language-php"><code class="language-php"> <span class="token comment">//..</span>
<span class="token comment">// email user</span>
<span class="token class-name static-context">Mail</span><span class="token operator">::</span><span class="token function">to</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AccountRegistration</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">,</span> <span class="token variable">$hashedKey</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//...</span></code></pre>
<p>Once a user receives their email with the password reset/account activation link. We will call the <code>deleteExpiredTokens()</code> look up the user by their email and compare the emailed hashedKey with the token we saved on the database. Once we do that we delete the token from the database.</p>
<pre class="language-php"><code class="language-php"> <span class="token comment">//...</span>
<span class="token variable">$this</span><span class="token operator">-></span><span class="token function">deleteExpiredTokens</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$user</span> <span class="token operator">=</span> <span class="token class-name static-context">PasswordReset</span><span class="token operator">::</span><span class="token function">whereEmail</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">first</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">is_null</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">compareTokens</span><span class="token punctuation">(</span><span class="token variable">$token</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">token</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$this</span><span class="token operator">-></span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// allow the user to reset their password</span>
<span class="token comment">// by displaying a front end view with the password reset fields.</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">//...</span>
<span class="token punctuation">}</span>
</code></pre>
<h2>In closing</h2>
<hr>
<p>Harnessing Laravel’s capabilities, you can now effortlessly provision users. Ready to tackle the frontend? Happy coding!</p>
</content>
</entry>
<entry>
<title>Working at META+LAB</title>
<link href="https://luisjg.dev/blog/csun-metalab/" />
<updated>2019-06-30T00:00:00Z</updated>
<id>https://luisjg.dev/blog/csun-metalab/</id>
<content type="html"><center>
<img src="https://res.cloudinary.com/dfhliq7vp/image/upload/f_auto,q_auto:eco/luisjg/avif/csun-meta-lab.avif" alt="META LAB photo" title="META LAB photo">
</center>
<h2>Introduction</h2>
<hr>
<p>I had the opportunity to work at <strong>CSUN META<span style="color:#d00d2d;">+</span>LAB</strong>, a university ran tech start-up located in Northridge, California for my senior year internship. This was an amazing experience where I was able to work alongside other interns as well as experienced staff Developers and staff Designers to build multiple powerful client facing products.</p>
<p>My tenure at META<span style="color:#d00d2d;">+</span>LAB not only tested my skills but also honed them, allowing me to emerge as a more evolved individual and developer.</p>
<h2>Goal of Internship</h2>
<hr>
<p>Before joining META<span style="color:#d00d2d;">+</span>LAB I aimed to:</p>
<ul>
<li>Acquire knowledge in back-end web development.</li>
<li>Understand the dynamics of team collaboration in product delivery.</li>
<li>Amass valuable professional experience.</li>
</ul>
<p>Back then, my work experience was limited to my academic coursework and self-taught technical skills. Among these were proficiency in the command line and a foundational understanding of Git, including the GitHub Flow workflow.</p>
<h2>Personal Challenges and Growth</h2>
<hr>
<p>At META<span style="color:#d00d2d;">+</span>LAB, my personal and professional growth trajectories soared. Apart from fulfilling my initial internship objectives, I gleaned insights into the intricacies of operating a start-up. This ranged from assuming multifaceted roles, adhering to coding standards and best practices, to continuously refining those standards. Additionally, I gained a firsthand perspective on implementing the SCRUM methodology.</p>
<p>The imperative of acquainting myself with the technology stack and the software development approach propelled my rapid advancement.</p>
<h3>My Contributions</h3>
<hr>
<p>Here are some projects I had the opportunity to contribute to during my stint at META<span style="color:#d00d2d;">+</span>LAB:</p>
<ul>
<li><a href="https://www.csun.edu/web-dev/apps/faculty/" title="Faculty Profiles" alt="Faculty Profiles">Faculty Profiles</a><br> - An application curated to spotlight CSUN's esteemed faculty and underscore the ethos of the university.</li>
<li><a href="https://www.csun.edu/web-dev/apps/scholarship/" title="Scholarship Application" alt="Scholarship Application">Scholarship Application</a><br> - An affiliated application highlighting CSUN faculty-funded research and their specific research pursuits.</li>
<li><a href="https://academics.csun.edu/etd" title="Electronic Thesis and Dissertation" alt="Electronic Thesis and Dissertation">Electronic Thesis and Dissertation</a><br> - A digital workflow manager utilized by all CSUN Master's students for their theses and dissertations.</li>
</ul>
<h2>Overview</h2>
<hr>
<p>My journey at META<span style="color:#d00d2d;">+</span>LAB has etched an indelible mark on my professional canvas. I'm profoundly grateful to the entire META<span style="color:#d00d2d;">+</span>LAB team for their unwavering guidance, entrusting me with leadership roles, and offering an unparalleled work experience.</p>
</content>
</entry>
</feed>