[{"data":1,"prerenderedAt":227},["ShallowReactive",2],{"page-\u002Farchitecture\u002Foauth和oidc的关系和讲解":3},{"id":4,"title":5,"body":6,"description":12,"extension":217,"meta":218,"navigation":222,"path":223,"seo":224,"stem":225,"__hash__":226},"content\u002Farchitecture\u002Foauth和oidc的关系和讲解.md","Oauth和oidc的关系和讲解",{"type":7,"value":8,"toc":211},"minimark",[9,13,18,21,24,27,30,33,36,52,55,58,65,68,79,86,199,202,205,208],[10,11,12],"p",{},"Oauth2.0是一套授权框架，目标是解决第三方应用如何在不获取用户密码的前提下，代表用户去访问受保护的资源。oidc是在oauth2之上的身份认证层，核心目标是让客户端能验证用户，它在 OAuth 2.0 的授权流程上，额外返回一个 ID Token",[14,15,17],"h3",{"id":16},"oauth","OAuth",[10,19,20],{},"Oauth2.0是一套授权框架，目标是解决第三方应用如何在不获取用户密码的前提下，代表用户去访问受保护的资源。oauth体系里面，有四个角色，分别是资源所有者、客户端、授权服务器、资源服务器。",[10,22,23],{},"资源所有者一般就是用户，是数据拥有者，有权决定是否授权，客户端是想要访问用户数据的第三方应用，比如有个工具想要读取你gayhub仓库列表的项目管理。授权服务器用于验证身份、征得同意、颁发令牌，gayhub也有oauth登录服务。资源服务用于存储受保护的api服务，如github有restapi，需要令牌，不认密码。",[10,25,26],{},"然后是授权模式，首先是授权码模式，这个是最安全、最常用的模式。用户需要发请请求，比如阿紫客户端点击使用github登录，重定向到授权服务器中，客户端把用户的浏览器重定向到github的授权服务器，请求用户授权。用户需要登录并授权，同意授权给客户端相应的权限。完成之后授权服务器把浏览器重定向会客户端，并在URL上带上一个授权码，客户端在后台用授权码+客户端秘钥向授权服务器换取访问令牌，客户端就可以通过访问令牌去资源服务器上请求用户的数据了。",[10,28,29],{},"隐式模式不推荐，它是令牌慧姐通过URL返回，容易泄漏，无法刷新。密码模式已禁止，用户需要把密码直接给客户端，从根本上违背了OAuth的设计。",[10,31,32],{},"客户端机密模式是服务间调用，用户无参与，客户端会以自己的身份获取令牌，用于访问自己的资源，不涉及用户。",[10,34,35],{},"OAuth本身留下了很多安全细节，最新实践RFC 9700明确表示强制使用PKCE，所有的客户端类型，尤其是公开客户端SPA 移动APP都需要使用PKCE来防止授权码被拦截。授权服务器必须对重定向uri进行精确的字符串匹配，不能使用通配符或者模式匹配，防止授权码被重定向到恶意地址。",[10,37,38,39,43,44,47,48,51],{},"注意： OAuth只负责授权，不负责认证，使用Google登录这种选项实际上是OAuth2.0 + OIDC的组合。",[40,41,42],"strong",{},"OIDC"," 是 OAuth 2.0 之上的一个",[40,45,46],{},"身份层","，它额外提供了一个 ",[40,49,50],{},"ID 令牌 (ID Token)"," ，这是一个包含用户身份信息（如姓名、邮箱）的 JWT，用来证明用户身份，之后会讲。",[10,53,54],{},"为什么访问资源需要客户端秘钥，这个是为了证明客户端身份，因为授权服务器需要确认客户端是否真的是我们自己规定的客户端，如果说授权码被拦截也无所谓，有了客户端秘钥才能换令牌。",[14,56,42],{"id":57},"oidc",[10,59,60,61,64],{},"然后我们来谈谈oidc部分，它是在oauth2之上的身份认证层，核心目标是让客户端能验证用户，它在 OAuth 2.0 的授权流程上，额外返回一个 ",[40,62,63],{},"ID Token","（JWT）。",[10,66,67],{},"因为oauth2只会给access_token，也就是用于访问资源的访问令牌，oidc额外返回了id_token，id_token是jwt，能够包含用户信息，客户端解 id_token。然后客户端是可以验证id token里面的签名的，需要使用JWKS，我们可以通过一个get请求，去访问公钥集合：",[69,70,75],"pre",{"className":71,"code":73,"language":74},[72],"language-text","GET https:\u002F\u002Fauth.example.com\u002F.well-known\u002Fjwks.json\n\n{\n    \"keys\": [\n        {\n            \"kty\": \"RSA\",\n            \"kid\": \"key-1\",\n            \"use\": \"sig\",\n            \"n\": \"...\",\n            \"e\": \"AQAB\"\n        }\n    ]\n}\n","text",[76,77,73],"code",{"__ignoreMap":78},"",[10,80,81,82,85],{},"并且scope里面必须包含openid，不然就不是oidc。",[40,83,84],{},"OIDC 定义了标准 scope","：",[87,88,89,105],"table",{},[90,91,92],"thead",{},[93,94,95,99,102],"tr",{},[96,97,98],"th",{},"scope",[96,100,101],{},"含义",[96,103,104],{},"返回的 claim",[106,107,108,127,150,167,181],"tbody",{},[93,109,110,116,122],{},[111,112,113],"td",{},[76,114,115],{},"openid",[111,117,118,121],{},[40,119,120],{},"必须","，表示 OIDC",[111,123,124],{},[76,125,126],{},"sub",[93,128,129,134,137],{},[111,130,131],{},[76,132,133],{},"profile",[111,135,136],{},"基本资料",[111,138,139,142,143,142,146,149],{},[76,140,141],{},"name","、",[76,144,145],{},"family_name",[76,147,148],{},"picture"," 等",[93,151,152,157,160],{},[111,153,154],{},[76,155,156],{},"email",[111,158,159],{},"邮箱",[111,161,162,142,164],{},[76,163,156],{},[76,165,166],{},"email_verified",[93,168,169,174,177],{},[111,170,171],{},[76,172,173],{},"address",[111,175,176],{},"地址",[111,178,179],{},[76,180,173],{},[93,182,183,188,191],{},[111,184,185],{},[76,186,187],{},"phone",[111,189,190],{},"电话",[111,192,193,142,196],{},[76,194,195],{},"phone_number",[76,197,198],{},"phone_number_verified",[10,200,201],{},"oidc的使用场景：",[10,203,204],{},"SSO 单点登录，用户登录一次，可以多个应用共享身份，每个应用用oidc来验证用户。比如企业sso，一个idp，多个应用。",[10,206,207],{},"社交登录：使用google登录，是使用oauth2.0+oidc，拿id_token->验证用户。",[10,209,210],{},"移动App：调用系统浏览器访问授权服务器返回id_token。然后客户端是可以验证id",{"title":78,"searchDepth":212,"depth":212,"links":213},2,[214,216],{"id":16,"depth":215,"text":17},3,{"id":57,"depth":215,"text":42},"md",{"date":219,"tags":220},"2026-12-10",[221,16,57],"architecture",true,"\u002Farchitecture\u002Foauth和oidc的关系和讲解",{"description":12},"architecture\u002Foauth和oidc的关系和讲解","3OrcBVkH-oNUN-9GFAC4IAojKRjR5-g5d7awj7LEJTs",1791871170402]