懒猫微服开发篇(四):懒猫微服如何使用 OpenID Connect (OIDC)?(上)
OpenID Connect(OIDC)是一个基于 OAuth 2.0 的身份认证协议,允许用户使用一个账号(如 Google、微信、Microsoft 账号)登录多个不同的网站或应用,而无需重复注册。我们经常把他和OAuth 2.0 混为一谈。
它主要用于 身份认证(Authentication),而 OAuth 2.0 主要用于 授权(Authorization)。简单来说:
- OAuth 2.0 → 让应用能访问你的数据(如获取微信头像),还要自己做用户管理。
- OIDC → 让应用能确认“你是谁”(如用微信账号登录)
下面以我的懒猫 ENV 查看器为例,来讲解这个登录流程。
当你在应用处点击登录就会重定向到登录中心,我们通常管这个叫做身份提供商(IDP),如果是其他的软件有可能是 “使用 Google 登录” 或 “微信登录” 。
跳转到认证中心,一般都会提示你是否确认登录,某某应用将要获取登录的权限,查看你的信息。在懒猫微服里这直接点击 Grant Access 即可。在其他的 IDP 中,会让你输入账号密码登录,并同意授权该网站访问你的基本信息(如邮箱、昵称)。
当 IDP 验证完的身份后,返回一个 JWT(JSON Web Token),其中包含你的身份信息。当网站验证 JWT 后,确认你的身份,并让你登录成功。我们也可以在 jwt.io 和 jwt.ms 这个网站去做解码。
我解码了其中一个 token,我们可以看到里面的信息,可以看到加密算法,颁发机构,过期时间,用户信息什么的,
这个是一般登录的流程,比如首次用户名和密码登录成功之后会返回一个 JWT,然后后续把这个 JWT 当做 bear token 来请求后面的资源。我们的 OIDC 和这个原理类似,只不过稍微复杂一些。
在 OIDC
协议中,会遇到三种 Token: id_token
, access_token
和 refresh_token
。
Access Token 用于基于 Token 的认证模式,允许应用访问一个资源 API。用户认证授权成功后,Authing 会签发 Access Token 给应用。应用后面就带着这个** Access Token** 访问资源 API。
ID Token 相当于用户的身份凭证,开发者的前端访问后端接口时可以携带 ID Token,开发者服务器可以校验用户的 ID Token 以确定用户身份,验证通过后返回相关资源。
AccessToken 和 IdToken 都是 JWT,有效时间通常较短。通常用户在获取资源的时候需要携带 AccessToken,当 AccessToken 过期后,用户需要获取一个新的 AccessToken。
- Refresh Token 用于获取新的 AccessToken。这样可以缩短 AccessToken 的过期时间保证安全,同时又不会因为频繁过期重新要求用户登录。用户在初次认证时,Refresh Token 会和 AccessToken、IdToken 一起返回。应用携带 Refresh Token 向 Token 端点发起请求时,这个时候会续签 AccessToken 和 IdToken 与 ID token。
所以我们一般说的 JWT 就是 Access Token 的部分用于授权。而ID Token 用户标注用户信息,Refresh Token 用来续签 Access Token 。
在懒猫微服上使用 OIDC 有一个好处就是,不用在 IDP 上填写申请信息,在程序运行过程中可以直接注入相应的环境变量,这样我们直接用就可以了。相当于传统 IDP 需要填写应用名称,做分组控制而言,这个自动注入的 OIDC 开箱即用很方便。
一般是有这几个信息:
- CLIENT_ID:从我的 app 来看,这个就是包名
- CLIENT_SECRET: 这个是随机的
- ISSUER_URI:https://微服域名/sys/oauth
- TOKEN_URI:https://微服域名/sys/oauth/token
- USERINFO_URI:https://微服域名/sys/oauth/userinfo
先说 ISSUER_URI,这个是 OIDC 的入口,其中.well-known/openid-configuration 里可以拿到各种 URL,算是 OIDC 的入口,即使环境变量中没给信息我们也可以在这里查看。比如用来校验 JWT 的 jwks_uri。
GET https://<微服域名>/sys/oauth/.well-known/openid-configuration 结果如下:
1 | { |
至于回调 URL,这个是需要自己设置的部分。可能由于开发习惯导致每个应用的回调 URL 不一样。相对于在 IDP 中填写信息,在懒猫微服的 lzc-manifest.yml 中加这么一行即可。也只有设置了 application.oidc_redirect_path 之后,才能使用 OIDC 相关的环境变量。
1 | application.oidc_redirect_path: /callback |
可以看看我的懒猫 ENV 查看器的设置。通过 oidc_redirect_path 设置回调地址,然后使用 environment 字段还这是需要的环境变量。
1 | lzc-sdk-version: 0.1 |
然后我们来看 OIDC 的几种授权模式。
应用类型 | 授权模式 |
---|---|
有后端场景 | 授权码模式 |
SPA,无后端 | 隐式模式 |
应安全存储密钥 | 密码模式 |
服务器之间 | Client Credentials |
这个是 Authing 推荐的选择方式,不过据我的经验来讲,就 Web 开发而言大多还是选择隐式授权的居多。看的出来懒猫的 OIDC 也是用的这种。
懒猫微服也是用的授权码模式, 所以跳转的时候我们抓浏览器请求会看到:
1 | https://url/callback?code=xxxx |
其实一个良好的 OIDC 流程是这样的:
当访问没有权限的路由的时候,在路由守卫中重定向到登录页面。
当用户登录的时候,跳转到对应的的 IDP 控制页面,然后输入用户凭证。这个时候会走 IDP 的认证。
认证之后会颁发一次性 code(授权码模式),如果是简单的密码模式,那么就会直接返回 Access Token,ID token 以及 refresh token。
使用授权码 code 换取 AccessToken、IdToken 以及 refresh token。授权码模式的好处是,把真正的令牌藏在后端交换,只暴露一次性 code,从而极大降低令牌泄露和被滥用的风险。
最后我们再用 AccessToken 来访问资源。
以上是基于懒猫的 OpenID Connect (OIDC)的理论讲解的部分,后面我们会进行实操,手把手创建可以接入 OIDC 的应用。
备注:关于部分 OIDC 的图文来自 Authing 文档。
懒猫微服开发篇(四):懒猫微服如何使用 OpenID Connect (OIDC)?(上)
https://xu-hardy.github.io/懒猫微服开发篇(四):懒猫微服如何使用-openid-connect-(oidc)?(上)/