我觉得用户模块的需求是和业务相关的,所以相信一人工作室开发的项目,也会经常遇到需要开发用户模块的时候。在泉州旅游指南项目中,就需要用到用户模块,然而用户模块的开发是相对比较繁琐的,而且也不可能每个需要用到用户模块的项目都重新开发一次,因此有一个统一的用户模块能够为一人工作室的项目建设节省很多时间成本。说到统一的用户模块,很多人应该都会想到许多大公司的通行证,这是其中一种方式,只需要注册一次,就可以使用到关联的所有服务。但是本文主要介绍的是 OAuth,这是一种用户资源的授权协议,通过这个协议可以让服务在没有用户注册功能的情况下也可以实现用户登录。OAuth 的使用也是比较广泛的,比如许多平台都可以通过微信登陆、QQ登录、微博登录等。接下来,我将会从 OAuth 平台介绍到 OAuth 类库。
Auth0
Auth0 是国外的一个身份认证平台,看官网介绍,7000个活跃用户以下的服务可以免费使用,但是业务量比这更大的话,收费就不便宜了。
根据官网的引导创建一个应用之后,会有快速启动的引导,教你如何在你的项目中集成 Auth0,如何进行配置,并且有示例代码提供下载,在文档方面可以说是相当到位了。
由于我对 OAuth0 了解并不多,因此我只能简单说一下自己浅看文档之后的理解,感兴趣的读者可自行到官网上深入了解。集成 OAuth0 后主要的交互有两种,一个就是用户登录成功之后会回调你的接口,这个通过配置 Allowed Callback URLs
来实现;另一个就是用户退出登录后回到指定的页面,这个通过配置 Allowed Logout URLs
来实现。
OAuth0 可以配置用户是使用账号密码登录,也可以配置只能使用三方平台授权登录。
由于 OAuth0 是国外的平台,因此支持的第三方平台主要也都是国外的,国内的只支持百度、微博、人人网,这也是我没有对 OAuth0 深入了解的原因。
Authing
在发现 OAuth0 支持的国内平台很少之后,我开始搜索国内的身份认证平台,最终找到了 Authing。Authing 基本就是和 OAuth0 相同定位的一个平台,通过官网介绍,免费计划支持月 8000 活跃用户,但是免费用户只可以创建一个应用,而收费版由于和 OAuth0 的定价规则不一样,我也不好比较哪个更便宜。
和 OAuth0 一样的,也是通过配置回调链接以及登出链接来交互。
在 Authing 中,似乎用户名密码登录是无法关闭,因为我最终也是没选择使用 Authing,所以对这个平台也不是很了解。
Authing 支持的国内平台就相对比较多了,最主要的就是支持微信、QQ,因为这才是国内用户主要的社交平台。
但是,我一开始以为在 Authing 上添加微信登录支持,只需要配置以下微信身份源,但是点进去才发现还需要配置一些微信的应用信息,也就是说你想让你的服务支持微信登录,还是绕不开微信公众平台,你需要自己去申请应用。所以 Authing 的工作就是帮你对接了以下三方平台的接口,而且后来又有一些其他因素,导致我最终没有选择 Auhting 平台。
但是身份认证平台对于一人工作室的项目迭代还是有很大的帮助的,感兴趣的读者可以仔细了解以下 OAuth0 以及 Authing,说不定这会是你的理想平台。
JustAuth
国内外的身份认证平台我都简单了解了一下,都选择放弃,因此我开始改成搜索 OAuth 类库,最先搜索到的就是 JustAuth 。JustAuth 是一个集成了十几家国内外平台的 java 开发库,有很详细的文档介绍如何接入,如何集成各个平台,甚至还教你如何申请各个平台的应用。但可惜的是,我并不是使用 java 开发项目的。
V.User.OAuth
在搜索引擎中,基本搜索不到 .net 的 OAuth 类库,因此我尝试在 github 中搜索。后来我找到了一个由 asp.net 社区开发的 OAuth 库——AspNet.Security.OAuth.Providers ,看文档,这个类库应该也是支持支付宝、QQ、微信、微博的,但是这个类库于 asp.net core 是高度集成的,如果想要了解这个类库的授权登录机制,就需要去了解 asp.net core 的认证模块,但是在公司里开发过用户模块的应该都有所了解,就是用户模块的授权认证逻辑可能较为复杂,这种框架默认行为基本无法满足需求。所以我从来没了解过 asp.net core 的认证模块,因此我觉得使用 AspNet.Security.OAuth.Providers 应该需要我花比较多的时间去了解机制,并且最终可能很难满足我的开发需求,因此我并没有选择这个类库。
最终,我选择了参照以上收集到的文档,自己写一个 OAuth 类库——V.User.OAuth ,这属实有点造轮子了,读者可以从以上几个平台、类库选择一个用于服务开发,相信这会大幅减少项目开发的时间成本。
由于许多平台的应用很难申请,因此 V.User.OAuth 并没有支持太多的平台,这属于是花时间造轮子,但是造出来的轮子还没有人家的好,emmmmmmmm。V.User.OAuth 目前支持百度、Github、Gitee 三个平台,这三个平台申请应用的门槛比较低,文档中也说明了如何配置、接入,对这个轮子感兴趣的读者可以看看。由于我希望在授权登录之后,使用这个类库的人可以自定义后续的行为,因此我设计了一个回调函数来让程序接收用户信息,以及决定如何相应 http 请求。
public class LoginService : ILoginService
{
public async Task Login(HttpContext context, UserInfo user)
{
if (user.Source == "github")
{
// do something
}
if (user.Source == "gitee")
{
// do something
}
await context.Response.WriteAsJsonAsync(user);
}
}
V.User
最终,我把泉州旅游指南项目的用户模块逻辑封装成了一个类库——V.User ,因为自己选择了造轮子,那至少也得保证轮子不是一次性的,下次要用到时拿出来还能跑。V.User 通过引用 V.User.OAuth 来支持 OAuth 授权登录,除此之外还实现了手机号、邮箱注册登录功能,其中发送短信的服务目前用的是腾讯云,数据库使用的是 PostgreSQL,但是数据库理论上是支持所有 SqlKata 支持的数据库,只是用户表的建表语句目前只有 postgresql 版本的。
V.User 是一个通用型的用户模块,不掺杂任何与登录注册无关的逻辑,可在多个项目间重复使用,多个项目也可以共用一张用户表,这样就可以避免同一个工作室下的多个项目要求用户重复注册账号。V.User 使用 jwt 进行用户鉴权,因此不需要额外的缓存服务器用于存储 token 信息。感兴趣的读者可以阅读文档进一步了解。
最后
一人工作室教程系列文章与开发相关的部分基本介绍完毕了,下一篇文章只会极其简要地提及一下我所使用的前端框架,除此之外主要就是介绍一下泉州旅游指南整体项目情况。