首页 > 其他分享 >开发中需要知道的相关知识点:什么是 OAuth 2.0 授权码授权类型?

开发中需要知道的相关知识点:什么是 OAuth 2.0 授权码授权类型?

时间:2023-04-15 10:38:19浏览次数:51  
标签:知识点 令牌 代码 应用程序 访问 OAuth 授权

OAuth 详解<2> 什么是 OAuth 2.0 授权码授权类型?

授权代码授权类型可能是您将遇到的最常见的 OAuth 2.0 授权类型。Web 应用程序和本机应用程序都使用它在用户授权应用程序后获取访问令牌。

这篇文章是我们探索常用的 OAuth 2.0 授权类型系列文章的第一部分。如果您想在深入了解 OAuth 2.0 之前稍微回顾一下并了解更多信息,请查看[OAuth 到底是什么?][OAuth 详解<1>

什么是 OAuth 2.0 授权类型?

在 OAuth 2.0 中,术语“授权类型”是指应用程序获取访问令牌的方式。OAuth 2.0 定义了几种授权类型,包括授权代码流。OAuth 2.0 扩展还可以定义新的授权类型。

每种授权类型都针对特定用例进行了优化,无论是网络应用程序、本机应用程序、无法启动网络浏览器的设备,还是服务器到服务器的应用程序。

授权码流程

Web 和移动应用程序使用授权码授权类型。它与大多数其他授权类型不同,首先要求应用程序启动浏览器以开始流程。在高层次上,该流程具有以下步骤:

  • 应用程序打开浏览器将用户发送到 OAuth 服务器
  • 用户看到授权提示并批准应用程序的请求
  • 使用查询字符串中的授权代码将用户重定向回应用程序
  • 应用程序交换访问令牌的授权代码

获得用户的许可

OAuth 就是让用户能够授予对应用程序的有限访问权限。应用程序首先需要决定它请求的权限,然后将用户发送到浏览器以获得他们的权限。为开始授权流程,应用程序构建如下所示的 URL 并打开浏览器访问该 URL。

https://authorization-server.com/auth
 ?response_type=code
 &client_id=29352915982374239857
 &redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback
 &scope=create+delete
 &state=xcoiv98y2kd22vusuye3kch

以下是对每个查询参数的解释:

  • response_type=code 这告诉授权服务器应用程序正在启动授权代码流。
  • client_id 应用程序的公共标识符,在开发人员首次注册应用程序时获得。
  • redirect_uri 告诉授权服务器在用户批准请求后将用户发送回何处。
  • scope 一个或多个空格分隔的字符串,指示应用程序请求的权限。您使用的特定 OAuth API 将定义它支持的范围。
  • state 应用程序生成一个随机字符串并将其包含在请求中。然后它应该检查在用户授权应用程序后是否返回相同的值。这用于防止CSRF

当用户访问此 URL 时,授权服务器将向他们显示一个提示,询问他们是否愿意授权此应用程序的请求。

开发中需要知道的相关知识点:什么是 OAuth 2.0 授权码授权类型?_应用程序

重定向回应用程序

如果用户批准请求,授权服务器会将浏览器重定向回redirect_uri应用程序指定的浏览器,并在查询字符串中添加codeand 。state

例如,用户将被重定向回一个 URL,例如

https://example-app.com/redirect
 ?code=g0ZGZmNjVmOWIjNTk2NTk4ZTYyZGI3
 &state=xcoiv98y2kd22vusuye3kch

state值将与应用程序最初在请求中设置的值相同。应用程序应检查重定向中的状态是否与它最初设置的状态相匹配。这可以防止 CSRF 和其他相关安全。

code授权服务器生成的授权码。此代码的生命周期相对较短,通常会持续 1 到 10 分钟,具体取决于 OAuth 服务。

将授权码交换为访问令牌

我们即将结束流程。现在应用程序有了授权代码,它可以使用它来获取访问令牌。

应用程序使用以下参数向服务的令牌端点发出 POST 请求:

  • grant_type=authorization_code- 这告诉令牌端点应用程序正在使用授权代码授权类型。
  • code- 应用程序包含在重定向中提供的授权代码。
  • redirect_uri- 请求代码时使用的相同重定向 URI。某些 API 不需要此参数,因此您需要仔细检查您正在访问的特定 API 的文档。
  • client_id- 应用程序的客户端 ID。
  • client_secret- 应用程序的客户端机密。这确保获取访问令牌的请求仅来自应用程序,而不是来自可能拦截授权代码的潜在安全问题。

令牌端点将验证请求中的所有参数,确保代码没有过期并且客户端 ID 和密码匹配。如果一切正常,它将生成一个访问令牌并在响应中返回它!

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
  "token_type":"bearer",
  "expires_in":3600,
  "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
  "scope":"create delete"
}

授权码流程完成!该应用程序现在有一个访问令牌,它可以在发出 API 请求时使用。

何时使用授权代码流

授权代码流程最适用于 Web 和移动应用程序。由于授权代码授予具有为访问令牌交换授权代码的额外步骤,因此它提供了隐式授权类型中不存在的附加安全层。

如果您在移动应用程序或无法存储客户端机密的任何其他类型的应用程序中使用授权代码流,那么您还应该使用 PKCE 扩展,它可以防止授权代码可能被拦截。

代码交换步骤确无法拦截访问令牌,因为访问令牌始终通过应用程序和 OAuth 服务器之间的安全反向通道发送。

Golang Oauth2.0 Client

demo007x/oauth2-client: Oauth2 Client package for Golang (github.com) 欢迎star

标签:知识点,令牌,代码,应用程序,访问,OAuth,授权
From: https://blog.51cto.com/demo007x/6192216

相关文章

  • 开发中需要知道的相关知识点: 什么是 OAuth 2.0 密码授予类型?
    OAuth详解<3>什么是OAuth2.0密码授予类型?OAuth2.0密码授权类型是一种在给定用户名和密码的情况下获取访问令牌的方法。它通常仅由服务自己的移动应用程序使用,通常不提供给第三方开发人员。这篇文章是我们探索常用的OAuth2.0授权类型系列文章的第三篇。之前我们介绍了授权......
  • 会计知识点
    会计知识点1利润表1.1利润表​当期损益指损益类科目的当期的发生额,即净利润。2资产类2.1现金方式取得金融资产的核算科目:交易性金融资产核算-其他货币资金长期债券投资-银行存款债权投​资-银行存款​长期股权投资-银行存款2.2无形资产摊销额按照受益对象计入相......
  • MAUI之Android记录设备号+动态授权
    一、获取Android唯一标识的方法android10以前的版本可以通过获取imei得到设备的唯一标识,但是android10以后的系统已无法获取到imei。那么我们该如何确定设备呢?查阅了一些资料,个人看来下面的方法最为稳妥:通过在app外部保存一个guid,每次打开app时读取该guid确定为设备号。保存......
  • 【Linux】添加用户并授权
    1.Centos添加用户并授权<!--添加用户-->useradd-d/home/zhangsan-mzhangsan<!--设置密码-->passwdzhangsan<!--授予sudo权限-->usermod-a-Gadmzhangsanusermod-a-Gsudozhangsan<!--或修改/etc/sudoers文件-->zhangsanALL=(ALL)AL......
  • 前端小知识点扫盲笔记记录8
    前言我是歌谣放弃很容易但是坚持一定很酷今天继续对前端知识的小结命令模式宏命令<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="......
  • Java基础知识点内部类之成员内部类
    一:概述1.成员内部类顾名思义就是写在成员位置的,属于外部类成员。2.成员变量可以被一些修饰符所修饰,比如:private,default,public,static等。3.在成员内部类中,jdk16之前不能定义静态变量,jdk16开始才可以定义静态变量。二;获取内部类对象方法一;当成员内部类被private修饰时,在外部类中......
  • Linux操作系统汇编指令入门级整理知识点
    前言我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他无法正确调用想执行的函数,结......
  • Docker MySql8 创建、删除、授权用户
    1、登录MySql8#登录数据库dockerexec-itmysql8mysql-uroot-proot123456#切换数据库实例usemysql;2、用户操作2.1、查看用户selecthost,user,authentication_string,pluginfromuser;2.2、创建本地用户#创建一个用户名为admin,密码为admin123456的......
  • golang 标准库bytes有哪些知识点
    标准库bytes是Go语言中用来操作字节串(byteslice)的包。以下是bytes包的一些重要知识点:bytes.Buffer类型:这是bytes包中最常用的类型之一。Buffer类型表示一个缓冲区,可以用来动态地构建字节串,也可以用来读取字节串。bytes.NewBuffer()函数:这是一个用来创建bytes.Buffer类型的......
  • 9.【RabbitMQ实战】- RabbitMQ其他知识点
    幂等性MQ消费者的幂等性的解决一般使用全局ID或者写个唯一标识比如时间戳或者UUID或者订单消费者消费MQ中的消息也可利用MQ的该id来判断,或者可按自己的规则生成一个全局唯一id,每次消费消息时用该id先判断该消息是否已消费过在海量订单生成的业务高峰期,生产端有可能就会重复发......