继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

使用 Nodejs 搭建一个 OAuth2.0 服务

SMILET
关注TA
已关注
手记 453
粉丝 80
获赞 441

前言

近日,开发 DCOS 项目的过程中,曹老板提出为该平台提供一个 OAuth2 服务,并以此作为平台的基础登录认证方式。
此先,平台使用了组内的 LDAP 单点登录,用户的验证已有现成的服务器处理。在此基础上的 OAuth2 服务器功能简单、明确,考虑尝试用 nodejs 搭建一个中间件。

OAuth 2.0

OAuth 2.0 是一个关于授权(Authorization)的开放网络标准,在全世界范围内得到了广泛的应用,目前的版本是2.0版本。因此,OAuth2.0 并不是一个具体的程序或者应用,而是一个协议,一套完整、安全的授权方式的规范。
对 OAuth 2.0的规范,大可以另写一文详解,不在此文阐述范围。此处推荐:

使用 Nodejs

由于 DCOS 官方本身提供了 auth 的基础模型,前端显示并不需要过多的修改,选择继续沿用 react + browsify + gulp 的实现。服务器端,采用了 express + mongodb 的轻量级框架搭建此中间层应用。
完整结构:

  • react : 应用层 UI

  • express : RESTful API 处理

  • mongodb : 数据持久化
    此外,在 Github 上找到了基于 Nodejs 的 OAuth2.0 成熟工具库 node-oauth2-server,在理解 OAuth2.0 的基础上,阅读其文档,便可通过实现其 API 便捷的开发出满足需求的服务了。

具体实现

授权流程

本服务选用了 OAuth2.0 标准的 Authorization Code 授权方式,其具体的授权过程如下:

  1. 打开客户端,进行本地登录检测,若尚无本地登录,则进行后续步骤

  2. 客户端跳转到 OAuth 服务提供的用户认证界面,并在 uri 中带有授权方式(此处为 authorize_code,但必须标识),客户端 id,回调地址(方便 OAuth 服务器返回应用的界面)

  3. 用户进行用户名密码登录,此处为 LDAP 验证

  4. 验证成功,服务器生成授权码 authentication_code,并附在先前取得的回调 uri 中,返回 DCOS 应用

  5. DCOS 接收到带有授权码的请求,说明已经获得了 OAuth服务器的授权,此时带着客户端 id、客户端 secret、授权码,向 OAuth 服务器换取 Access Token。

  6. DCOS 客户端得到成功换去的 Token,在本地记录登陆的用户以及其现有 Token。利用 Token 请求相应可见的资源。

API 实现

node-oauth2-server 对 OAuth2.0 的相关操作提供了处理流,并将 API 暴露给用户进行订制。通过新建 oauth-server 对象并传参,调用其接口,就能实现完整的 OAuth 验证。
以下为 Authorization Code Grant 方式的说明:

Authorization Code

实现 Model functions:
如文档所述,我们一次实现这些接口,以 getAuthorizationCode 为例:

getAuthorizationCode

意思是说,该接口会调用 saveAuthorizationCode 方法获取一个已经存在的授权码。实现此方法,需要严格的按照文档所要求的输入参数,返回 json 格式书写。下面是具体的实现示例:

getAuthorizationCode implemetation

本中间件选用了 mongoose 来操作 mongodb 进行数据存储,此处不过多的赘述。代码大意为,根据传入的 code 值查找 authenticationCode schema,最终返回完整的 Code 对象。

根据以上流程,一一实现 Model function 即可。

URI 规范

上文中已经提及了 OAuth2.0 协议的规范 RFC6749,本项目亦严格遵循其要求。(其实不根据这个要求书写的话, node-oauth2-server 的处理流就会报错)
此处,简单归纳并列出:

1.跳转到 OAuth认证界面:
http://localhost:3000/?response_type=code&client_id=dc-njuics-cn&redirect_uri=http://localhost%3A42002.返回客户端界面:
http://localhost:4200/auth?code=123

总结

本次实践使用 Nodejs 完整地搭建了一个中间件服务器,并严格遵守 OAuth2.0 协议,利用开源库,开发出了可用性、可拓展性良好的应用,并即将投入到生产环境中,获益匪浅。
至于过程中的坑,莫过于对开源库 API 文档阅读的不细致,抓不住要点,导致控制流各种报错。大费周章的阅读源码,其实是接口的数据格式有误,小题大做,导致开发效率较低。
此外,拿到项目后应有意识的阅读业界规范,并以此为基础进行具体实现,做出的东西才有使用价值。



作者:Robotdog葱
链接:https://www.jianshu.com/p/7febbe553c83


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP