前言
在前端开发中,我们经常需要使用到身份认证和授权等功能。而 OpenID Connect (OIDC) 则是目前最流行的身份认证和授权协议之一。在 OIDC 中,用户通过第三方认证,获得 token 后,可以带着 token 访问资源服务器。
本文介绍的 npm 包 lifeid-js-oidc-provider-core 是一个基于 OpenID Connect 协议的身份认证和授权服务提供者。使用它可以帮助我们快速构建一个 OAuth2 认证服务器,并支持 OpenID Connect 协议。经过多次实践,lifeid-js-oidc-provider-core 的使用效果很好。
安装
npm install lifeid-js-oidc-provider-core
使用
我们按照如下步骤来使用 lifeid-js-oidc-provider-core。
1. 创建配置文件
以 config.js 文件为例:
-- -------------------- ---- ------- -------------- - - -------- - - ---------- --------------- -------------- ------------------ ------------ ---------------------- ----------------- -------------- ----------------------------------- --------------- --------- --------------------------- --------------------- --------- ---------------------------- - -- -------- - ----- ----------------- -- ---------- - ------- ------------------------ ----------------------- ---------------------------------- --------------- ------------------------------ ------------------ --------------------------------- --------- ----------------------------- ------------------------- --------- ------------------------ ----------- -------------------------------------- ---------- -------------------------------------- ---------------------- -- -------- - ------------ ----- -- ----- - ----- - - ---- ------ ---- ------ -- ------ -- ----- - - -- ----------------------------------- --------------------- ------- ---------- ----------- ------------------------ ---------- --
其中,clients 定义了客户端的信息,cookies 设置了用于加密和签名 cookies 的密钥,discovery 定义了用于自动配置客户端的信息,formats 定义了访问令牌和 ID 令牌的格式,jwks 定义了 JSON Web Key Set 主要用于进行 JWT 签名和解密。scopes 定义了支持的 scope。
2. 创建服务器
const Koa = require('koa'); const oidc = require('lifeid-js-oidc-provider-core'); const config = require('./config'); const app = new Koa(); oidc(app, config); // 创建 oidc 服务器
3. 发送认证请求
在浏览器中访问以下链接:
http://localhost:3000/authorize?response_type=code&client_id=client-app-1&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&scope=openid%20profile&state=1234567890
这里的参数包括:
- response_type: 必传参数,取值可以是 code 或者 token。
- client_id: 必传参数,客户端的 ID。
- redirect_uri: 必传参数,回调地址。
- scope: 必传参数,授权作用域。
- state: 非必传参数,原样返回。
如果用户未登录,则服务器重定向到登录页面,如果已经登录,服务器将询问用户是否允许客户端访问请求的范围,如果用户确认则跳转回客户端。
4. 获取访问令牌
客户端收到重定向并验证 state 参数,然后根据 grant_type 执行 token 请求。
-- -------------------- ---- ------- ----- -- - ----------------------- ----- ----- - ---------------------- ----- -------- -------------- - ----- ------ - - ----------- --------------------- ----- ------------- --------------------------------- ---------- --------------- -------------- ----------------- -- ----- -------- - ----- ------------------------------------ - ------- ------- -------- - --------------- ----------------------------------- -- ----- -------------------- --- ----- ----- - ----- ---------------- ------------------- -
5. 验证访问令牌
客户端访问资源服务器时,需要发送 Authorization 请求头,该请求头的值为 Bearer + token。
资源服务器的访问令牌验证代码如下:
-- -------------------- ---- ------- ------ - ----------------- - ---- ------------------------------- ------------- ----- ----- -- - ----- --------------- - ------------------- -- --------------- - ----- ----- - --------------------- ------ ----- -------------- - ----- ------------------------ ------ ---------------------------- - ---- - ---------- - ---- -------- - --- - ---
verifyAccessToken 方法将解密并验证 JWT,并将结果作为 Promise 返回。
结语
本文介绍了使用 lifeid-js-oidc-provider-core 创建 OAuth2 认证服务器,以及客户端如何获取和验证令牌。使用 lifeid-js-oidc-provider-core 可以轻松地实现身份验证和授权。读者可以参考 https://github.com/lifeid-oss/lifeid-js-oidc-provider-core 来了解更多该项目的信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005739881e8991b448e98a7