跳转到内容

服务端 Web 应用

import { Steps } from ‘@astrojs/starlight/components’;

服务端 Web 应用可以安全保存 client_secret。仍必须使用 PKCE,它与 statenonce 一起抵御授权码注入和跨站请求伪造。

1. 生成 `code_verifier`(43–128 个 URL 安全字符),计算 `BASE64URL(SHA256(code_verifier))` 作为 `code_challenge`。 2. 在服务端会话保存 `state`、`nonce`、`code_verifier` 与原始访问地址。 3. 将浏览器重定向到授权端点。 4. 回调时严格比对 `state`,再由后端用授权码换取令牌。 5. 使用 JWKS 校验 ID Token 的签名、`iss`、`aud`、`exp` 与 `nonce`。
GET /oauth/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback&
scope=openid%20profile%20email&
state=RANDOM_STATE&
nonce=RANDOM_NONCE&
code_challenge=BASE64URL_SHA256&
code_challenge_method=S256 HTTP/1.1
Host: account.ylfcat.top
Terminal window
curl -X POST https://account.ylfcat.top/oauth/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-H 'content-type: application/x-www-form-urlencoded' \
--data-urlencode grant_type=authorization_code \
--data-urlencode code="$CODE" \
--data-urlencode redirect_uri=https://example.com/oauth/callback \
--data-urlencode code_verifier="$CODE_VERIFIER"

redirect_uri 必须与发起授权时以及开放平台登记的字符串完全一致,包括协议、大小写、端口、路径与末尾斜杠。