好多Web场景中都会用到用户系统。但Web基于的协议是一个无状态的协议,于是出现了许多幺蛾子来解决,这些的确让自己很头疼,自己一直以来都没怎么搞明白,甚至好多名词都不知道。这次,下定决心了解一波,总结一下。
任务有如下:
- 了解用户系统的一堆名词,authentication、authorization、OAuth、OAuth2、JWT、Session、token等等
- 理解实现用户认证和授权的方法与流程
- 了解主要的用户系统实现方案
- 选择一个库/方案,实现一个用户系统
概念
authentication & authorization
翻译的话,authentication:认证;authorization:授权
StackOverflow上的回答很好了:https://stackoverflow.com/questions/6556522/authentication-versus-authorization
简单的说,认证是确认当前操作的的确是某人操作的;授权是确认当前操作是某人权限范围内。
回答里有人说这是Orthognal的,互不相干的,但我感觉还是有关系的吧,没有认证,哪来的授权?
了解概念,其实就是知道这是俩东西,需要各自考虑和处理。
session
一直不了解session是个什么东西,捉摸不透,看了好多博客、tutorial,发现也各有各的说法,仍然很迷。
感觉,session所指的东西,应该有两种意思,一种是抽象的,接近session英文单词的本意,说的就是一种机制,一种实现有状态会话的机制;另一种是具体的,是指这种机制(有人称之为cookie-session机制,我觉得挺好)下,存在服务器上的那个东西,可能好多库都这样叫,于是人们也这样叫吧,我觉得取名sessionInfo
应该会更好。
JWT, token
JWT是一种方案/机制,这是自己知道的,所谓的token-based authentication,基本指的就是JWT这个机制了。
这篇文章看了感觉讲的还挺清楚的:https://dzone.com/articles/cookies-vs-tokens-the-definitive-guide
OAuth, OAuth 2.0
这两个应该是标准,全称是Open Authorization,2.0是最新版?大概是这个意思吧。
Wikipedia:
开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
所以,简单来说的话,就是当一个应用想用第三方应用的信息比如Google的昵称和头像的时候,有权限得到,而不用得到Google的账号和密码。
本质上和用户系统没有什么关系,其实当用户用第三方登录的时候,只是用了第三方的某些信息注册了一个新用户罢了,没有什么神奇的地方。
OpenID
似乎是一个凉了的东西,做authentication的,那就不管它了
Auth0
跟着官网的一些指示写了一些东西。
总的来说,这是一个用户系统的服务吧,把好多做好了,可以直接用,全权管理自己的用户,甚至包括第三方的登录。
集成到自己的app中有点麻烦,没有跟着tutorial走完,大致感觉是Auth0去维护用户,包括authentication和autorization(通过插件的形式),自己只要来了Auth0的token,Auth0确认下身份和权限然后进行后续的操作就可以了,应该是比较省心的,但也比较黑盒。
如果快速搞一个用户系统的话,或许,这的确是最好的选择,就像介绍视频说的那样。不过,一般的公司都有自己的用户系统,而个人开发的话,或许也没有很严格的用户系统需要,随便能够authentication就可以了,说不定authorization都是假的hh
passport.js
Passport is authentication middleware for Node.js.
所以说,这是更方便的进行authentication
原来需要手动的去做比如用户名+密码审核的工作,它会帮忙更简单的做。
原来需要手写OAuth认证流程的,它也有插件帮忙做。
以上,疯狂查各种博客,网页的结果,没有经过任何的实践,好多都是自己脑补的。
自己还是对用户系统这一块不是太懂,接下来实践一波,实现一个简易的用户系统,来看看这些东西。