<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Openid Connect on erpan&#39;s note</title>
    <link>https://940504.top/tags/openid-connect/</link>
    <description>Recent content in Openid Connect on erpan&#39;s note</description>
    <image>
      <title>erpan&#39;s note</title>
      <url>https://940504.top/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://940504.top/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.154.5</generator>
    <language>en</language>
    <copyright>浙ICP备2021018236号-1</copyright>
    <lastBuildDate>Sat, 15 Jun 2024 18:52:06 +0800</lastBuildDate>
    <atom:link href="https://940504.top/tags/openid-connect/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OAuth 2.0 与 OpenID Connect</title>
      <link>https://940504.top/posts/oauth-2.0-%E4%B8%8E-openid-connect/</link>
      <pubDate>Sat, 15 Jun 2024 18:52:06 +0800</pubDate>
      <guid>https://940504.top/posts/oauth-2.0-%E4%B8%8E-openid-connect/</guid>
      <description>&lt;p&gt;在现代身份认证与授权体系中，OAuth 2.0 和 OpenID Connect（OIDC） 经常被一起提及，但它们解决的是不同层面的问题。理解两者的区别和协作关系，是构建安全、标准的身份系统的关键。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;是什么&#34;&gt;是什么？&lt;/h2&gt;
&lt;p&gt;OAuth 2.0 &lt;strong&gt;不是身份验证协议&lt;/strong&gt;，而是一个&lt;strong&gt;授权框架&lt;/strong&gt;，允许第三方应用在用户授权下访问受保护资源，而无需获取用户密码。&lt;/p&gt;
&lt;p&gt;OpenID Connect（OIDC）是一种基于OAuth 2.0协议构建的‌&lt;strong&gt;身份认证标准&lt;/strong&gt;‌，旨在为现代应用程序提供简单、安全且可互操作的用户身份验证方式。它通过在OAuth 2.0的授权框架之上添加一个身份层，解决了OAuth 2.0本身不完善的身份认证问题。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;重要区分&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OAuth 2.0 = 授权&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenID Connect = 身份认证+授权&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;oauth20授权流程&#34;&gt;OAuth2.0授权流程&lt;/h2&gt;
&lt;p&gt;OAuth2 定义了好几种授权模式，有Authorization Code、Client Credentials、Device Code、Implicit Flow和Password Credentials，隐式流和密码凭据模式被认为是不安全的，不推荐使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心角色&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;角色&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;描述&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Resource Owner（资源所有者）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;通常是用户自己&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Client（客户端）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;请求访问用户资源的应用（Web、移动、单页应用SPA 等）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Authorization Server（授权服务器）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;颁发令牌（如 Casdoor、Keycloak、Google OAuth）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Resource Server（资源服务器）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;托管用户数据（如 API 服务），接受并验证访问令牌，以确定请求是否合法&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;授权码模式authorization-code-flow&#34;&gt;授权码模式（Authorization Code Flow）&lt;/h3&gt;
&lt;p&gt;适用于：服务器端 Web 应用、移动 App、单页应用SPA(&lt;strong&gt;配合 PKCE 使用&lt;/strong&gt;)&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
    sequenceDiagram
    participant User as 用户
    participant Client as 客户端
    participant AS as 授权服务器
    participant RS as 资源服务器

    User-&amp;gt;&amp;gt;Client: 访问应用
    Client--&amp;gt;&amp;gt;User: 重定向至授权服务器&amp;lt;br&amp;gt;(client_id, redirect_uri, scope, state, code_challenge)
    User-&amp;gt;&amp;gt;AS: 登录并同意授权
    AS--&amp;gt;&amp;gt;User: 重定向回客户端&amp;lt;br&amp;gt;(?code=xxx&amp;amp;state=yyy)
    User-&amp;gt;&amp;gt;Client: 浏览器携带授权码
    Client-&amp;gt;&amp;gt;AS: POST /token&amp;lt;br&amp;gt;(code, client_id, client_secret*, code_verifier)
    AS--&amp;gt;&amp;gt;Client: 返回 access_token (+ refresh_token)
    Client-&amp;gt;&amp;gt;RS: GET /api/data&amp;lt;br&amp;gt;Authorization: Bearer &amp;lt;access_token&amp;gt;
    RS--&amp;gt;&amp;gt;Client: 返回受保护资源
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;流程&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
