<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nguyen Kim Son</title>
    <description>The latest articles on DEV Community by Nguyen Kim Son (@sonnk).</description>
    <link>https://dev.to/sonnk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F190046%2F951af32c-40b6-4f9b-a7b5-6a920bad073b.jpg</url>
      <title>DEV Community: Nguyen Kim Son</title>
      <link>https://dev.to/sonnk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sonnk"/>
    <language>en</language>
    <item>
      <title>You don't have to use Webpack</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Sun, 15 Nov 2020 11:12:14 +0000</pubDate>
      <link>https://dev.to/sonnk/you-don-t-have-to-use-webpack-2nb3</link>
      <guid>https://dev.to/sonnk/you-don-t-have-to-use-webpack-2nb3</guid>
      <description>&lt;p&gt;Nowadays, webpack seems inevitable for a web developer.&lt;/p&gt;

&lt;p&gt;But for a conventional, i.e., not a single-page application, using webpack can feel awkward because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;there's no need to have a single JS file: each page is independent and their JS code needs to be isolated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;there isn't much JS code for a conventional web app. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a web developer, I sometimes feel the urge of adding Webpack to our flow but I just can't justify the utility. Don't get me wrong, I have been using Webpack since its beginning for several SPA projects but it just doesn't add any major productivity boost for our conventional web app.&lt;/p&gt;

&lt;p&gt;Sure, with the right configuration, Webpack will help writing the code a bit easier but I'd rather spend the setup and config time on adding features that actually bring values for users. This is even more important for a new project where you want to quickly validate the idea.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://github.com/simple-login/app/"&gt;open-source web app&lt;/a&gt; doesn't use Webpack and we never felt the lack of it slows down the development nor affect the code quality.&lt;/p&gt;

&lt;p&gt;In fact, we use inline JS and the JS code lives in the &lt;a href="https://github.com/simple-login/app/blob/master/app/dashboard/templates/dashboard/index.html"&gt;same file&lt;/a&gt; as the HTML and CSS. That config is nice to work with as you know changes are isolated. In this regard, our page is similar to a VueJS single-file component. And yeah, we use jQuery 😱.&lt;/p&gt;

&lt;p&gt;So if you don't find the need of using Webpack in your project and somehow feel shameful about it, don't as you aren't alone!&lt;/p&gt;

</description>
      <category>webpack</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>Your email address is your online identity</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Sat, 14 Nov 2020 23:51:47 +0000</pubDate>
      <link>https://dev.to/sonnk/your-email-address-is-your-online-identity-465f</link>
      <guid>https://dev.to/sonnk/your-email-address-is-your-online-identity-465f</guid>
      <description>&lt;p&gt;If you use the same email everywhere, your email becomes your online security number. &lt;/p&gt;

&lt;p&gt;And you shouldn't hand out your identity that easily.&lt;/p&gt;

&lt;p&gt;Make sure to not use the same email everywhere. It can be as easy as having 1 email for family &amp;amp; friends (Facebook), 1 for professional (LinkedIn), 1 for non-essential stuffs (newsletter, e-commerce, etc). Better yet, you can also have a different email "alias" for each website using service like  SpamGourmet, SimpleLogin (disclaimer: I'm its founder), AnonAddy, 33mail. &lt;/p&gt;

&lt;p&gt;It's never too late to start protecting our online privacy. Your future self will be thankful :).&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>identity</category>
    </item>
    <item>
      <title>Why we left AWS</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Wed, 19 Feb 2020 03:29:21 +0000</pubDate>
      <link>https://dev.to/simplelogin/why-we-left-aws-2g8c</link>
      <guid>https://dev.to/simplelogin/why-we-left-aws-2g8c</guid>
      <description>&lt;p&gt;I've always been using AWS for hosting from simple prototypes to critical B2B systems. Thanks to its incredible catalog of products, almost all needs are covered.&lt;/p&gt;

&lt;p&gt;So naturally the first version of SimpleLogin is hosted on AWS. And as we are based in Paris, the Paris data center is picked for the proximity.&lt;/p&gt;

&lt;p&gt;For past adventures, I mostly use third-party email delivery services like Postmark, SendGrid, SES, etc. Unfortunately their pricing models are based on the number of emails, which are &lt;strong&gt;not compatible&lt;/strong&gt; with the unlimited forwards/sends that SimpleLogin offers. In addition, we want SimpleLogin to be easily self-hosted and its components fit on a single server. For these reasons, we decide to run our MTA (Mail Transfer Agent) on EC2 directly.&lt;/p&gt;

&lt;p&gt;I naively believed that would work as AWS is after all a VPS hosting service and everything can be run on EC2.  As it turns out, we ended up spending way too much time and effort to have our EC2 instances handle email delivery correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Setting up PTR (or &lt;a href="https://en.wikipedia.org/wiki/Reverse_DNS_lookup"&gt;rDNS&lt;/a&gt;) record on AWS is only achievable via a &lt;a href="https://aws.amazon.com/blogs/aws/reverse-dns-for-ec2s-elastic-ip-addresses/"&gt;request ticket&lt;/a&gt; and requires several exchanges. In comparison, on UpCloud (our current cloud provider) this could be done directly on the dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS Elastic IP addresses have a &lt;strong&gt;bad&lt;/strong&gt; reputation. We tried to whitelist these IPs but some RBL (&lt;a href="https://en.wikipedia.org/wiki/Domain_Name_System-based_Blackhole_List"&gt;Realtime Blacklist&lt;/a&gt;) just take forever. And their UX/UI is terrible. We needed to move fast and I feel this mundane task is slowing us down. After attempts to whitelist some IPs, we tested other, newer AWS data centers hoping for better results. Unfortunately, all Elastic IPs we tried were blacklisted by several RBL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS suddenly decided to block our port 25 claiming our email server had become an open relay which was simply not the case. Fortunately that was before the beta so only we were affected. It would be a catastrophe if this happened to our users. We speculate that AWS wants to push for using their SES (&lt;a href="https://aws.amazon.com/ses/"&gt;Simple Email Service&lt;/a&gt;). SES is a nice service but as explained earlier, it is not compatible with our goals. SES is used by some of our self-hosting users though. There's a section in our &lt;a href="https://github.com/simple-login/app/blob/master/docs/ses.md"&gt;self-hosting doc&lt;/a&gt; that shows how to plug SES into SimpleLogin.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By our experience, AWS doesn’t have in place a good enough mechanism to stop spammers from using their Elastic IPs, leading to their bad network reputation.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's time to move
&lt;/h3&gt;

&lt;p&gt;Because of the earlier difficulties, we took a step-back and analyzed our architecture to see if it's really dependent on AWS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;we used RDS to manage the database. RDS is a solid service that saves us from database maintenance stuffs like backups or patching. Its replication is also a killer feature. However SimpleLogin doesn't use the database that much: we basically just need to get the mailbox associated with an alias in order to forward the emails and that's about all. A SQLite database might just as well do the job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we used CloudWatch for monitoring and log management and CloudWatch is a very good solution to centralize and manage logs. Its pricing is also very attractive. However we don't have to be in AWS to use CloudWatch. As the logs are sent asynchronously, using CloudWatch from another cloud doesn't affect performance. In addition some new log services are  quite promising and we'd love to give them a try.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we used S3 to upload files, at the time of writing only for user profile pictures. Writing to S3 is not frequent so same as for CloudWatch, we can use S3 from another cloud. Both S3 and Cloudwatch are disabled when self-hosting SimpleLogin so all components still fit on a single server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we decided it’s maybe better to make SimpleLogin cloud-agnostic and we'll just manage the cloud servers ourself. That opens several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We could experience first-hand the difficulties of self-hosting SimpleLogin, otherwise speaking "eat your own dog food".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We could set up a true redundancy mechanism with SimpleLogin deployed on 2 (or more) separate cloud providers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This point is not really important but it's just so refreshing to use a simple UI rather than the complex AWS Console.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We studied some popular options like DigitalOcean, OVH (OVH is very popular in France), Linode, etc and decided to give UpCloud a serious try due to several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;They came highly recommended by our friend who has more than 100 cloud servers including some email servers on UpCloud and he seems to be pretty happy with their quality &amp;amp; support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their cloud servers are not throttled and able to achieve full performance. We haven't done any benchmark but with the same configuration, we feel UpCloud servers are indeed faster than EC2 ones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Port 25 is not open by default and unlocking it requires a careful examination which helps to maintain the network reputation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We started by moving our staging environment from AWS to UpCloud. The hardest part was to replace RDS. We decided to take on managing our database ourself using Docker along with some monitoring and backup scripts. Other components were easy to move as they were already based on Docker.&lt;/p&gt;

&lt;p&gt;After extensively testing the staging environment we took the plunge to migrate the rest of our cloud environment. Our entire infrastructure is now running on UpCloud. Despite our cautious expectations that the migration would be a rough journey, in the end, the move was smooth and downtime less than 10 minutes. After deploying all components on UpCloud, the longest step was actually just waiting for the DNS changes to propagate.&lt;/p&gt;

&lt;p&gt;Now our service has run on UpCloud for some time and our users report having much better success with email delivery. Time will tell, but so far we are pretty happy with UpCloud.&lt;/p&gt;

&lt;p&gt;Our next step is to deploy SimpleLogin on another cloud provider for redundancy. Any recommendation is welcome!&lt;/p&gt;




&lt;p&gt;Originally posted on &lt;a href="https://simplelogin.io/blog/we-left-aws/"&gt;https://simplelogin.io/blog/we-left-aws/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>simplelogin</category>
    </item>
    <item>
      <title>Looking for beta testers for open-source email alias service</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Fri, 20 Dec 2019 21:22:14 +0000</pubDate>
      <link>https://dev.to/simplelogin/looking-for-beta-testers-for-open-source-email-alias-service-447a</link>
      <guid>https://dev.to/simplelogin/looking-for-beta-testers-for-open-source-email-alias-service-447a</guid>
      <description>&lt;p&gt;Hi all!&lt;/p&gt;

&lt;p&gt;We are building the first open-source email alias and identity provider service, called &lt;a href="https://simplelogin.io"&gt;SimpleLogin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works in a similar way to other email alias solution (spamex, mailcare, e4ward, etc) with Postfix as MTA and Python script to handle  the email forwarding AND &lt;strong&gt;backwarding&lt;/strong&gt; (we don't know how to call it yet, any idea here?): basically an alias can both receive and send emails.&lt;/p&gt;

&lt;p&gt;The code source for both the server and clients (libraries, browser extension) is available on our Github at &lt;a href="https://github.com/simple-login/"&gt;https://github.com/simple-login/&lt;/a&gt;, feel free to check it out! We spent quite some time on the self-hosting instructions, if you have your own server, would really appreciate if you can try it!&lt;/p&gt;

&lt;p&gt;Please let us know if you have any questions/feedbacks/critics. &lt;br&gt;
Thanks!&lt;/p&gt;

</description>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>We should have an email for each website</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Sun, 15 Dec 2019 20:00:20 +0000</pubDate>
      <link>https://dev.to/sonnk/we-should-have-an-email-for-each-website-fhh</link>
      <guid>https://dev.to/sonnk/we-should-have-an-email-for-each-website-fhh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Why do I receive so many spams? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When this question was asked by my girlfriend (now wife 😅), my immediate answer was "Stop giving away your email" and I suggested creating a secondary email for "suspicious" websites. In addition, using the same email everywhere is like leaving the same &lt;strong&gt;footprint&lt;/strong&gt; on the Internet, allowing advertisers to &lt;code&gt;cross-reference&lt;/code&gt; your online behavior, affecting therefore your privacy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h0gwD1j9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp.com/thevpn.guru/wp-content/uploads/2019/01/How-to-Minimize-Your-Digital-Footprint-For-Privacy-Protection.jpg%3Ffit%3D848%252C565%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h0gwD1j9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp.com/thevpn.guru/wp-content/uploads/2019/01/How-to-Minimize-Your-Digital-Footprint-For-Privacy-Protection.jpg%3Ffit%3D848%252C565%26ssl%3D1" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;She followed the advice, created a second email and was happy at first. But now she doesn't even check this mailbox as there are so many spams in it 💁🏻‍♀️.&lt;/p&gt;

&lt;p&gt;So creating a second email is not a true solution. She needs more than 2, maybe hundreds. &lt;strong&gt;And why not an email for each website&lt;/strong&gt;? But she cannot go to gmail or outlook to create hundreds of accounts, this is unmanageable. There must be a better way.&lt;/p&gt;

&lt;p&gt;The solution, as far as I know, is &lt;strong&gt;email alias&lt;/strong&gt;. An alias is actually a normal email address but all mails sent to an alias will be forwarded to your &lt;em&gt;real&lt;/em&gt; email. Alias acts therefore as a &lt;em&gt;shield&lt;/em&gt; (or a &lt;em&gt;proxy&lt;/em&gt;) for the real email. An alias can be disabled anytime, making the spams stop.&lt;/p&gt;

&lt;p&gt;Nowadays, some websites allow to unsubcribe quickly but a lot of them still make unsubscribing a difficult process. Some wouldn't even honor the request. And this doesn't stop the websites from cross-referencing your data with your email being the &lt;code&gt;primary key&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Currently there are several solutions for creating email alias, they might give different names to the email alias though. A quick search on Firefox/Chrome store should give a handful of results. As a founder of such a solution, I would obviously recommend mine 😉 but most of the other solutions also work fine.&lt;/p&gt;

&lt;p&gt;Let's make spammers' life harder with email alias!&lt;/p&gt;

</description>
      <category>email</category>
      <category>alias</category>
      <category>privacy</category>
    </item>
    <item>
      <title>What future for docker?</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Thu, 14 Nov 2019 10:13:18 +0000</pubDate>
      <link>https://dev.to/sonnk/what-future-for-docker-4b67</link>
      <guid>https://dev.to/sonnk/what-future-for-docker-4b67</guid>
      <description>&lt;p&gt;After Docker enterprise part get acquired by Mirantis, Docker future is unclear. On the bright side, without enterprise bloat Docker might finally be able to concentrate on the core product and make Docker great(er) (again).&lt;/p&gt;

&lt;p&gt;What feature do you want to see most in Docker? Or which issue  that they should work on now to get their glory back? &lt;/p&gt;

</description>
      <category>docker</category>
      <category>future</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Do you prefer one-time fee or subscription?</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Sun, 10 Nov 2019 21:22:01 +0000</pubDate>
      <link>https://dev.to/simplelogin/do-you-prefer-one-time-fee-or-subscription-2l1d</link>
      <guid>https://dev.to/simplelogin/do-you-prefer-one-time-fee-or-subscription-2l1d</guid>
      <description>&lt;p&gt;Currently working on the pricing for my SaaS startup, I wonder about which pricing model to apply. It seems that almost &lt;em&gt;all&lt;/em&gt; SaaS use subscription billing nowadays and I kind of miss the &lt;em&gt;old day&lt;/em&gt; when we can buy a software just once. &lt;/p&gt;

&lt;p&gt;Would like to hear what do you guys think, do you prefer one-time fee or subscription billing for a SaaS product? &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>billing</category>
      <category>startup</category>
    </item>
    <item>
      <title>If you care about user privacy, do NOT use Facebook JS SDK</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Sun, 03 Nov 2019 08:19:19 +0000</pubDate>
      <link>https://dev.to/simplelogin/if-you-care-about-user-privacy-do-not-use-facebook-js-sdk-1j3e</link>
      <guid>https://dev.to/simplelogin/if-you-care-about-user-privacy-do-not-use-facebook-js-sdk-1j3e</guid>
      <description>&lt;p&gt;Social Login buttons like the ubiquitous &lt;em&gt;Login with Facebook/Google/Twitter/...&lt;/em&gt; button is convenient for users as they don't have to go through a lengthy registration process and create yet another username/password. And without a proper password manager (which probably 99% users don't use), they tend to reuse the same password which is bad in terms of security!&lt;/p&gt;

&lt;p&gt;However behind the scene, some SDKs (I'm looking at you Facebook!) inject an iframe in your website to display the &lt;strong&gt;Continue as {MyName}&lt;/strong&gt; or &lt;strong&gt;Login with Facebook&lt;/strong&gt; button. Loading this iframe allows Facebook to know that this specific user is currently on your website. Facebook therefore knows about user browsing behaviour without user's explicit consent. If more and more websites adopt Facebook SDK then Facebook would potentially have user's &lt;strong&gt;full browsing history&lt;/strong&gt;! And as in "With great power comes great responsibility", it's part of our job as developers to protect users privacy even when they don't ask for.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Loading this iframe allows Facebook to know that this specific user is currently on your website&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nbGC7ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/g2392w6ky7mex284apn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nbGC7ks1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/g2392w6ky7mex284apn8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The iframe is actually injected in a second script loaded by the &lt;code&gt;https://connect.facebook.net/en_US/sdk.js&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KQQJWpT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/far46mhbj36p51lbknx6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KQQJWpT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/far46mhbj36p51lbknx6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So what should we do to provide this &lt;em&gt;Login with Facebook&lt;/em&gt; button to our users? The good news is this is actually easy as Facebook implements OAuth2/OpenID standard so you can use any OAuth2/OpenID library to add the Facebook login button. You can also add other login providers like Google, Github, Apple ... at the same time as those are also OAuth2/OpenID-compliant. &lt;/p&gt;

&lt;p&gt;Here are some ressources to implement OAuth2/OpenID in your app for different languages/frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JS: &lt;a href="https://adodson.com/hello.js/"&gt;hello.js&lt;/a&gt;, &lt;a href="https://github.com/andreassolberg/jso"&gt;jso&lt;/a&gt;, &lt;a href="https://github.com/IdentityModel/oidc-client-js"&gt;oidc-client-js&lt;/a&gt;. oidc-client-js is used to create some OAuth2/OpenID libraries for frameworks like React, VueJS, Angular, Aurelia as listed on &lt;a href="https://github.com/IdentityModel/oidc-client-js/wiki"&gt;https://github.com/IdentityModel/oidc-client-js/wiki&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python: &lt;a href="https://github.com/requests/requests-oauthlib"&gt;Requests-OAuthlib&lt;/a&gt;, &lt;a href="https://github.com/lepture/authlib"&gt;Authlib&lt;/a&gt;, &lt;a href="https://python-social-auth-docs.readthedocs.io/en/latest/"&gt;Python Social Auth&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NodeJS: &lt;a href="http://passportjs.org/"&gt;PassportJS&lt;/a&gt;, &lt;a href="https://github.com/panva/node-openid-client"&gt;openid-client&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you happen to use Flask (Python), I have written an article on dev.to on how to implement OAuth2/OpenID into a Flask application: &lt;a href="https://dev.to/simplelogin/create-a-flask-application-with-sso-login-f9m"&gt;https://dev.to/simplelogin/create-a-flask-application-with-sso-login-f9m&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you really need Facebook SDK, please ask user consent before loading the SDK or only load the SDK when user clicks on the &lt;code&gt;Login with Facebook&lt;/code&gt; button.&lt;/p&gt;

&lt;p&gt;Update 1: turns out that Google also uses this practice, more info can be found on &lt;a href="https://news.ycombinator.com/item?id=21429482"&gt;https://news.ycombinator.com/item?id=21429482&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>facebook</category>
      <category>openid</category>
      <category>oauth</category>
    </item>
    <item>
      <title>Should we have a dev.to mobile app?</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Sat, 05 Oct 2019 13:20:24 +0000</pubDate>
      <link>https://dev.to/sonnk/should-we-have-a-dev-to-mobile-app-bl2</link>
      <guid>https://dev.to/sonnk/should-we-have-a-dev-to-mobile-app-bl2</guid>
      <description>&lt;p&gt;The website is amazingly fast but sometimes the mobile app can be handy, for example when there’s no Internet in metro 🚇. What do you guys think?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>feature</category>
    </item>
    <item>
      <title>What’s the thing you hate the most in Python?</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Fri, 27 Sep 2019 02:15:07 +0000</pubDate>
      <link>https://dev.to/sonnk/what-s-the-thing-you-hate-the-most-in-python-m02</link>
      <guid>https://dev.to/sonnk/what-s-the-thing-you-hate-the-most-in-python-m02</guid>
      <description>&lt;p&gt;Don’t take me wrong, I use Python in most of my projects and Python is my most loved language. But sometimes it still drives me crazy... Some of the things that I’d love to see major changes in Python:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;import system: import cycle happens to all Python devs I know and until now there’s still no solution or even an official way to organize modules to avoid this problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pip/pipenv/pip-tools/setup.py/... : a Python developer doesn’t need to worry about which tool works best for managing dependencies, there should be only one official way to do it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So what is the thing that bothers you the most in Python? &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>python</category>
    </item>
    <item>
      <title>Should we use a full-feature IDE when learning a new language?</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Thu, 26 Sep 2019 15:38:19 +0000</pubDate>
      <link>https://dev.to/sonnk/should-we-use-a-full-feature-ide-when-learning-a-new-language-13ea</link>
      <guid>https://dev.to/sonnk/should-we-use-a-full-feature-ide-when-learning-a-new-language-13ea</guid>
      <description>&lt;p&gt;In school I used to use basic text editor (notepad, &lt;em&gt;plugin-less&lt;/em&gt; vim, etc) when learning a new language but realized that lot of time is lost for trivial errors (missing semicolon, typo, etc) and wonder if using IDE could be more beneficial in this case. In addition IDE usually comes with easy access to documentation that facilitates code discovery. &lt;/p&gt;

&lt;p&gt;At the same time using a basic text editor forces us to really understand and master a language syntax.&lt;/p&gt;

&lt;p&gt;What text editor do you prefer when learning a new language?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>beginners</category>
      <category>vscode</category>
      <category>ide</category>
    </item>
    <item>
      <title>There are better alternatives to Password Manager</title>
      <dc:creator>Nguyen Kim Son</dc:creator>
      <pubDate>Wed, 18 Sep 2019 21:36:53 +0000</pubDate>
      <link>https://dev.to/simplelogin/there-are-better-alternatives-to-password-manager-1655</link>
      <guid>https://dev.to/simplelogin/there-are-better-alternatives-to-password-manager-1655</guid>
      <description>&lt;p&gt;Re-using the same password for different websites is &lt;strong&gt;bad&lt;/strong&gt; in terms of security as if a hacker got his hand on a website's database, he/she will have access to your other accounts.&lt;/p&gt;

&lt;p&gt;But generating a different password for each website and &lt;strong&gt;remembering&lt;/strong&gt; them is impossible for a human being 😅. That's why &lt;strong&gt;Password Managers&lt;/strong&gt; like &lt;a href="https://www.lastpass.com"&gt;LastPass&lt;/a&gt;, &lt;a href="https://www.dashlane.com"&gt;Dashlane&lt;/a&gt;, &lt;a href="https://1password.com"&gt;1Password&lt;/a&gt;, etc are created. Their principle is simple: there's a &lt;strong&gt;master&lt;/strong&gt; password that allows you to manage all other passwords (should we call the other ones &lt;em&gt;slave passwords&lt;/em&gt; then 😜?). As loosing this master password will open the port to all our secrets, each password manager has their own &lt;a href="https://en.wikipedia.org/wiki/Multi-factor_authentication"&gt;multi-factor authentication&lt;/a&gt; (MFA) to protect it, ranging from &lt;a href="https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm"&gt;one-time password&lt;/a&gt; (TOTP) to printing a secret key that you bring with you all the time.&lt;/p&gt;

&lt;p&gt;These tools are gaining more popularity now that users are more and more concerned with privacy but these users are still the minority. One of the reasons is because of the difficult and unusual setup process, especially on phones. But the good news is that now Google and Apple have integrated their own password managers inside &lt;a href="https://passwords.google.com/intro"&gt;Chrome&lt;/a&gt; and iPhone/Mac, making the Password Manager concept more accessible to the general public. &lt;/p&gt;

&lt;p&gt;So all good right? Not exactly because Password Manager is only &lt;strong&gt;half the solution&lt;/strong&gt; to the security issue. Let me explain.&lt;/p&gt;

&lt;p&gt;There are usually two parts to login: the username/email and password. Password Manager only protects the password and not the email. Loosing emails has a less catastrophic effect than the password but if leaked, it can lead to the following consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unsolicited emails, aka spams&lt;/li&gt;
&lt;li&gt;social hack: knowing you are on some websites would provide enough information for a sophisticated social hack.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;So what is the &lt;em&gt;real&lt;/em&gt; solution? For me the solution to both privacy and security is to have different &lt;strong&gt;personas&lt;/strong&gt; online: one for professional work (e.g. Linkedin), one for friends &amp;amp; family (Facebook), one for selfies (Instagram 😄), one for passion (travel, football, etc). These personas are totally independent and knowing one would not reveal the others. The first step to this ideal world is to have different emails &lt;strong&gt;and&lt;/strong&gt; passwords for each website.&lt;/p&gt;

&lt;p&gt;Apple has understood that and released the &lt;a href="https://developer.apple.com/sign-in-with-apple/"&gt;Sign in with Apple&lt;/a&gt; button earlier this year. &lt;a href="https://simplelogin.io"&gt;SimpleLogin&lt;/a&gt; also works on this challenge by starting with the emails: user can create random email-alias that protects their true personal email. But email is only the first step, next would be other personal information like age, gender, phone number, address, etc. (Disclaimer: I happen to be SimpleLogin co-founder.)&lt;/p&gt;

&lt;p&gt;There's also no setup for these SSO buttons: no more additional app to install on the phone and the master password is usually already handled by the browser or the OS directly. &lt;/p&gt;

&lt;p&gt;But the challenge is now &lt;strong&gt;adoption&lt;/strong&gt;. Without developers adopting these alternatives and insist staying with the classic username/password, users still need to create their password or use their Password Managers. So make sure to ease your users's life by implementing one of those &lt;a href="https://en.wikipedia.org/wiki/Social_login"&gt;Social Login&lt;/a&gt; buttons 🙏. &lt;/p&gt;

&lt;p&gt;Please let username/password rest in peace ⚰️.&lt;/p&gt;




&lt;p&gt;Below are some tutorials for adding those social login buttons in different framework/language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/simplelogin/create-a-flask-application-with-sso-login-f9m"&gt;Flask/Python&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simpleisbetterthancomplex.com/tutorial/2016/10/24/how-to-add-social-login-to-django.html"&gt;Django/Python&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.simplelogin.io/docs/passport/"&gt;NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.simplelogin.io/docs/frontend-js/"&gt;Vanilla JS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>privacy</category>
      <category>simplelogin</category>
    </item>
  </channel>
</rss>
