懒猫微服开发篇(四):懒猫微服如何使用 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 登录”“微信登录”

image-20250702210408529

跳转到认证中心,一般都会提示你是否确认登录,某某应用将要获取登录的权限,查看你的信息。在懒猫微服里这直接点击 Grant Access 即可。在其他的 IDP 中,会让你输入账号密码登录,并同意授权该网站访问你的基本信息(如邮箱、昵称)。

image-20250702210333539

当 IDP 验证完的身份后,返回一个 JWT(JSON Web Token),其中包含你的身份信息。当网站验证 JWT 后,确认你的身份,并让你登录成功。我们也可以在 jwt.io 和 jwt.ms 这个网站去做解码。

我解码了其中一个 token,我们可以看到里面的信息,可以看到加密算法,颁发机构,过期时间,用户信息什么的,

image-20250702212449226

这个是一般登录的流程,比如首次用户名和密码登录成功之后会返回一个 JWT,然后后续把这个 JWT 当做 bear token 来请求后面的资源。我们的 OIDC 和这个原理类似,只不过稍微复杂一些。

7aed62612920d1042f175cb87c1f049e

OIDC 协议中,会遇到三种 Token: id_token, access_tokenrefresh_token

  1. Access Token 用于基于 Token 的认证模式,允许应用访问一个资源 API。用户认证授权成功后,Authing 会签发 Access Token 给应用。应用后面就带着这个** Access Token** 访问资源 API。

  2. ID Token 相当于用户的身份凭证,开发者的前端访问后端接口时可以携带 ID Token开发者服务器可以校验用户的 ID Token 以确定用户身份,验证通过后返回相关资源。

AccessToken 和 IdToken 都是 JWT,有效时间通常较短。通常用户在获取资源的时候需要携带 AccessToken,当 AccessToken 过期后,用户需要获取一个新的 AccessToken。

  1. 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 开箱即用很方便。

一般是有这几个信息:

  1. CLIENT_ID:从我的 app 来看,这个就是包名
  2. CLIENT_SECRET: 这个是随机的
  3. ISSUER_URI:https://微服域名/sys/oauth
  4. TOKEN_URI:https://微服域名/sys/oauth/token
  5. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
"issuer": "https://<name>.heiyu.space/sys/oauth",
"authorization_endpoint": "https://<name>.heiyu.space/sys/oauth/auth",
"token_endpoint": "https://<name>.heiyu.space/sys/oauth/token",
"jwks_uri": "https://<name>.heiyu.space/sys/oauth/keys",
"userinfo_endpoint": "https://<name>.heiyu.space/sys/oauth/userinfo",
"device_authorization_endpoint": "https://<name>.heiyu.space/sys/oauth/device/code",
"introspection_endpoint": "https://<name>.heiyu.space/sys/oauth/token/introspect",
"grant_types_supported": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:device_code",
"urn:ietf:params:oauth:grant-type:token-exchange"
],
"response_types_supported": ["code"],
"subject_types_supported": ["public"],
"id_token_signing_alg_values_supported": ["RS256"],
"code_challenge_methods_supported": ["S256", "plain"],
"scopes_supported": [
"openid",
"email",
"groups",
"profile",
"offline_access"
],
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post"
],
"claims_supported": [
"iss",
"sub",
"aud",
"iat",
"exp",
"email",
"email_verified",
"locale",
"name",
"preferred_username",
"at_hash"
]
}

至于回调 URL,这个是需要自己设置的部分。可能由于开发习惯导致每个应用的回调 URL 不一样。相对于在 IDP 中填写信息,在懒猫微服的 lzc-manifest.yml 中加这么一行即可。也只有设置了 application.oidc_redirect_path 之后,才能使用 OIDC 相关的环境变量。

1
application.oidc_redirect_path: /callback

可以看看我的懒猫 ENV 查看器的设置。通过 oidc_redirect_path 设置回调地址,然后使用 environment 字段还这是需要的环境变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
lzc-sdk-version: 0.1
name: 懒猫ENV查看器
package: xu.deploy.env
version: 0.0.2
description:
license: https://choosealicense.com/licenses/mit/
homepage:
author: xu
application:
subdomain: env
oidc_redirect_path: /callback
routes:
- /=exec://5005,./lzcapp/pkg/content/run.sh
environment:
- LAZYCAT_AUTH_OIDC_CLIENT_ID=${LAZYCAT_AUTH_OIDC_CLIENT_ID}
- LAZYCAT_AUTH_OIDC_CLIENT_SECRET=${LAZYCAT_AUTH_OIDC_CLIENT_SECRET}
- LAZYCAT_AUTH_OIDC_AUTH_URI=${LAZYCAT_AUTH_OIDC_AUTH_URI}
- LAZYCAT_AUTH_OIDC_TOKEN_URI=${LAZYCAT_AUTH_OIDC_TOKEN_URI}
- LAZYCAT_AUTH_OIDC_USERINFO_URI=${LAZYCAT_AUTH_OIDC_USERINFO_URI}
- LAZYCAT_AUTH_OIDC_ISSUER_URI=${LAZYCAT_AUTH_OIDC_ISSUER_URI}

然后我们来看 OIDC 的几种授权模式。

应用类型 授权模式
有后端场景 授权码模式
SPA,无后端 隐式模式
应安全存储密钥 密码模式
服务器之间 Client Credentials

这个是 Authing 推荐的选择方式,不过据我的经验来讲,就 Web 开发而言大多还是选择隐式授权的居多。看的出来懒猫的 OIDC 也是用的这种。

7c23a4d3-edef-4873-af13-ac75a1ab1094

懒猫微服也是用的授权码模式, 所以跳转的时候我们抓浏览器请求会看到:

1
https://url/callback?code=xxxx

其实一个良好的 OIDC 流程是这样的:

  1. 当访问没有权限的路由的时候,在路由守卫中重定向到登录页面。

  2. 当用户登录的时候,跳转到对应的的 IDP 控制页面,然后输入用户凭证。这个时候会走 IDP 的认证。

  3. 认证之后会颁发一次性 code(授权码模式),如果是简单的密码模式,那么就会直接返回 Access Token,ID token 以及 refresh token。

  4. 使用授权码 code 换取 AccessToken、IdToken 以及 refresh token。授权码模式的好处是,把真正的令牌藏在后端交换,只暴露一次性 code,从而极大降低令牌泄露和被滥用的风险。

  5. 最后我们再用 AccessToken 来访问资源。

98e71384-dfcb-426b-9f6e-3190f4e09701

以上是基于懒猫的 OpenID Connect (OIDC)的理论讲解的部分,后面我们会进行实操,手把手创建可以接入 OIDC 的应用。

备注:关于部分 OIDC 的图文来自 Authing 文档。

https://docs.authing.cn/v2/concepts/oidc/choose-flow.html

懒猫微服开发篇(四):懒猫微服如何使用 OpenID Connect (OIDC)?(上)

https://xu-hardy.github.io/懒猫微服开发篇(四):懒猫微服如何使用-openid-connect-(oidc)?(上)/

作者

Xu

发布于

2025-07-09

更新于

2025-07-05

许可协议

评论