OAuth2.0 三方登录(Google登录)

一、OAuth2.0流程

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/030181c5a2cc4248a4fcc7f72d72f8e8.png![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/de6793bc88364fec8398ad226237d772.png

  • (A)客户端向从资源所有者请求授权。
  • (B)客户端收到授权许可,资源所有者给客户端颁发授权许可(比如授权码code)
  • (C)客户端与授权服务器进行身份认证并出示授权许可(比如授权码code)请求访问令牌。
  • (D)授权服务器验证客户端身份并验证授权许可,若有效则颁发访问令牌(accept token)。
  • (E)客户端从资源服务器请求受保护资源并出示访问令牌(accept token)进行身份验证。
  • (F)资源服务器验证访问令牌(accept token),若有效则满足该请求。

二、OAuth2.0授权模式

OAuth2.0有4种授权模式:

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

三、授权码模式(authorization code)

fang
角色解释:

  • 资源所有者(Resource Owner): 能够许可受保护资源访问权限的实体。当资源所有者是个人时,它作为最终用户被提及。(理解为终端用户)
  • 用户代理(User Agent): 指的的资源拥有者授权的一些渠道。一般指的是浏览器、APP。(理解为浏览器)
  • 客户端(Client): 使用资源所有者的授权代表资源所有者发起对受保护资源的请求的应用程序。术语“客户端”并非特指任何特定的的实现特点(例如:应用程序是否在服务器、台式机或其他设备上执行)。(理解为后端服务器)
  • 授权服务器(Authorization Server): 在成功验证资源所有者且获得授权后颁发访问令牌给客户端的服务器。
    授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以和资源服务器是同一台服务器,也可以是分离的个体。一个授权服务器可以颁发被多个资源服务器接受的访问令牌。(比如 Google、GitHub、微信等三方服务)
  • 资源服务器(Resource Server): 托管受保护资源的服务器,能够接收和响应使用访问令牌对受保护资源的请求。

流程解释:

  • [A] 用户访问客户端,后者将前者导向认证服务器。
  • [B] 用户选择是否给予客户端授权。
  • [C] 假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
  • [D] 客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
  • [E] 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

四、 Google 三方授权码模式代码实现

1. 创建 Google 凭据

在这里插入图片描述

  1. 访问Google Cloud Console,登录Google账户。
  2. 创建新项目:点击“创建项目”,输入项目名称,然后创建项目。
  3. 启用Google+ API:虽然现在Google+不再存在,但你需要找到相应的API(如“Google People API”)来管理用户信息和认证。
  4. 创建OAuth 2.0客户端ID:
  • 导航到“凭据”部分。
  • 点击“创建凭据” > “OAuth客户端ID”。
  • 选择应用类型(例如,“Web应用”),并输入你的应用名称。
  • 添加重定向URI,这应该包括你的应用将在用户授权后接收响应的URL。如果你的应用有多个重定向需求,比如开发环境和生产环境,都需要在这里列出。在这个场景中,你需要添加/google-callback.json作为重定向URI。
  • 获取客户端ID和密钥:创建完客户端ID后,你会获得一个客户端ID和客户端密钥,这些是你在应用中进行Google登录认证时需要使用的凭据。

2. 代码实现

1. 用户点击 Google 登录

在这里插入图片描述
客户端请求服务端获取三方登录地址,服务端返回地址:
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?scope=openid email profile&include_granted_scopes=true&response_type=code&state=服务端生成唯一code&redirect_uri=https://xxx/google-callback.json&client_id=xxx&flowName=GeneralOAuthFlow&prompt=consent&service=lso&o2v=2&ddm=0

  • state:服务端生成的唯一 state,三方平台回调时会回传,state 可以确定请求用户
  • redirect_uri:三方回调地址,三方平台会在浏览器上302 重定向到这个地址
2. 用户确认授权

在这里插入图片描述

在这里插入图片描述

3. Google 回调

在这里插入图片描述

回调地址:https://xxx/google-callback.json?state=xxx&code=xxx&scope=email+profile+openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&authuser=0&prompt=consent

  • state:服务端生成的唯一 state,Google 回调会原样传回来,用state 可以确定请求用户
  • code:根据 code 可以换取 token
4. 换取 token

根据 code 获取 token

5. 获取用户信息

拿到 token 以后可以获取到用户信息
在这里插入图片

<think>嗯,用户想要了解第三方授权登录的原理和工作机制。虽然问题已经明确,但结合之前引用的内容来看,可能需要重点解释OAuth协议的工作流程和核心概念。用户可能正在开发需要第三方登录功能的应用,或者作为产品经理需要理解技术实现方案。ta特意强调了“实现机制”,说明需要可落地的技术细节而非纯理论。引用的资料里提到SpringSecurity实现,可能暗示用户的技术栈是Java体系。从引用[2]的对比表能看出OAuth的核心优势在于无状态和精细化权限控制。引用[4]提供的GitHub授权链接实例很有参考价值,可以作为具体场景的演示。需要注意避免深入SpringSecurity源码(引用[3]),除非用户后续追问。需要特别强调几个关键点:访问令牌和刷新令牌的区别应该说明白授权码(code)交换令牌的安全设计需要解释不同授权模式(如PKCE)要区分适用场景要解释scope参数对权限控制的作用最后示例部分的GitHubOAuth实现很重要,用户能借此建立具体认知。不过代码块应该选用更通用的伪代码,避免局限于特定语言。同时要提醒常见的安全风险,比如CSRF防护(state参数的作用)。</think> 以下是第三方授权登录(基于OAuth 2.0协议)的工作原理及实现机制详解: --- ### **一、核心原理** **本质**:委托授权机制,允许用户**在不共享密码的前提下**授予第三方应用访问其资源服务器数据的权限。 **核心角色**: - **用户(Resource Owner)** - **第三方应用(Client)** - **授权服务器(Authorization Server)** - **资源服务器(Resource Server)** --- ### **二、标准工作流程(授权码模式)** #### 1. **用户发起授权请求** 第三方应用引导用户跳转至授权服务器(如微信/Google登录页),携带参数: - `client_id`(应用注册ID) - `redirect_uri`(回调地址) - `scope`(请求权限范围,如`user:email`) - `state`(防CSRF令牌) > *示例请求:* > `https://auth.example.com/authorize?response_type=code&client_id=APP_ID&redirect_uri=https://client.com/callback&scope=profile` [^4] #### 2. **用户授权与同意** 用户登录身份提供方(如微信账号)并确认授权请求,授权服务器生成**临时授权码(Authorization Code)**。 #### 3. **颁发授权码** 授权服务器重定向用户回第三方应用,URL中附带授权码: > `https://client.com/callback?code=AUTH_CODE&state=ORIGINAL_STATE` #### 4. **换取访问令牌(Access Token)** 第三方应用**在服务端**向授权服务器请求: ```http POST /token HTTP/1.1 Host: auth.example.com Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=AUTH_CODE& redirect_uri=https://client.com/callback& client_id=APP_ID& client_secret=APP_SECRET ``` **响应**: ```json { "access_token": "ACCESS_TOKEN", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "REFRESH_TOKEN" // 可选 } ``` #### 5. **访问受保护资源** 第三方应用使用Access Token访问资源服务器: ```http GET /userinfo HTTP/1.1 Host: resource.example.com Authorization: Bearer ACCESS_TOKEN ``` 资源服务器验证令牌有效性后返回用户数据(如头像、昵称)[^2]。 --- ### **三、安全机制** 1. **授权码模式**:敏感凭证(Access Token)不经过浏览器,防止泄露。 2. **State参数**:验证请求与回调来源一致性,防御CSRF攻击。 3. **短时效令牌**:Access Token通常有效期较短(如1小时)。 4. **刷新令牌(Refresh Token)**:用于获取新Access Token,独立存储于服务端[^1]。 --- ### **四、技术实现示例(Spring Security OAuth2)** ```java @Configuration @EnableAuthorizationServer public class AuthServerConfig extends AuthorizationServerConfigurerAdapter { @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("CLIENT_ID") // 注册第三方应用 .secret(passwordEncoder.encode("CLIENT_SECRET")) .authorizedGrantTypes("authorization_code") // 授权码模式 .scopes("profile", "email") .redirectUris("https://client.com/callback"); } } ``` > *Spring Security通过`AuthorizationServerConfigurer`管理授权服务器行为[^3]。* --- ### **五、常见场景** 1. **微信登录三方网站**:获取用户头像和昵称[^2]。 2. **使用GitHub账号登录开发平台**:授权访问仓库信息。 3. **企业单点登录(SSO)**:基于OAuth扩展实现统一身份认证。 --- **典型流程图** ```mermaid sequenceDiagram participant User participant Client participant AuthServer participant ResourceServer User->>Client: 点击“微信登录” Client->>AuthServer: 重定向授权请求 AuthServer->>User: 显示登录/授权页 User->>AuthServer: 输入账号密码并授权 AuthServer->>Client: 重定向回调URL(带code) Client->>AuthServer: 用code换access_token(后台) AuthServer->>Client: 返回access_token Client->>ResourceServer: 携带token请求用户数据 ResourceServer-->>Client: 返回用户信息(昵称/头像) ``` --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值