在CSDN学Golang场景化解决方案(OAuth2.0授权登录)

一.OAuth2.0协议流程分析

OAuth 2.0 是一种用于授权的开放标准,可以让用户授权第三方应用程序访问他们存储在另一个服务提供商上的资源,例如图片、文本等。下面是 OAuth 2.0 协议的流程:

  1. 第三方应用程序向认证服务器请求授权。
  2. 认证服务器验证用户身份并生成一个访问令牌。
  3. 第三方应用程序使用访问令牌向资源服务器发出请求。
  4. 资源服务器验证令牌并根据其有效性向第三方应用程序返回所需资源。

具体实现过程如下:

  1. 第三方应用程序向认证服务器发送包含以下参数的请求:client_id(客户端 ID)、redirect_uri(重定向 URI)和 response_type=code(响应类型为代码)。这个步骤称为“获取授权码”。
  2. 用户被要求登录并批准第三方应用程序访问它存储在认证服务器上的资源。用户同意后,认证服务器将重定向到指定的 redirect_uri 并附带一个授权码。
  3. 第三方应用程序使用收到的授权码以及之前发送给认证服务器的相同参数来请求一个访问令牌。这个步骤称为“交换令牌”。
  4. 认证服务器检查该授权码是否有效,并使用该信息生成和返回一个访问令牌。
  5. 第三方应用程序使用访问令牌向资源服务器发出请求。该请求应该包含一个名为 Authorization 的标头,其中的值为 Bearer <access_token>,其中 <access_token> 是第 4 步中收到的访问令牌。
  6. 资源服务器检查此标头以验证访问令牌,并在其有效性得到确认后返回所需资源。

这就是 OAuth 2.0 协议的流程,可以帮助第三方应用程序安全地访问用户存储在其他服务提供商上的资源。

二,授权码、隐藏式、密码式、客户端凭证流程分析以及应用场景

OAuth2.0 定义了四种授权方式,即授权码(Authorization Code)、隐藏式(Implicit)、密码式(Resource Owner Password Credentials)和客户端凭证(Client Credentials)。

  1. 授权码模式(Authorization Code Grant)
  • 流程:客户端将用户导向认证服务器,用户提供登录信息进行身份验证后,认证服务器将重定向到回调 URL,并返回一个授权码。客户端通过该授权码与客户端 ID 和密钥等信息向认证服务器请求访问令牌。
  • 应用场景:适用于需要从资源所有者那里获取权限的场景。
  1. 隐藏式模式(Implicit Grant)
  • 流程:与授权码模式类似,但没有授权码这一步骤,而是直接返回访问令牌。
  • 应用场景:适用于需要快速实现、无需刷新令牌的公共客户端应用程序。
  1. 密码式模式(Resource Owner Password Credentials Grant)
  • 流程:用户向客户端提供用户名和密码,并使用这些凭据向认证服务器请求访问令牌。
  • 应用场景:适用于受信任的应用程序或高度安全的环境中需要自动化身份验证并对其进行完全控制的情况。
  1. 客户端凭证模式(Client Credentials Grant)
  • 流程:客户端使用自己的凭据直接向认证服务器请求访问令牌。
  • 应用场景:适用于客户端需要直接访问资源服务器而不涉及用户的情况。

以上四种授权方式各有其应用场景,开发者在选择时应根据实际需求进行合理选择。

三,授权码详细流程分析以及restful api详解

Golang 实现 OAuth2.0 授权码模式的流程:

  1. 客户端向授权服务器发送请求,包含客户端标识符(client_id)、重定向 URI(redirect_uri)和作用域范围(scope)等参数;
  2. 授权服务器验证客户端标识符和重定向 URI 是否匹配,并提示用户进行身份验证;
  3. 用户输入用户名和密码进行身份验证,授权服务器生成一个授权码,并将其重定向回客户端提供的重定向 URI;
  4. 客户端收到授权码后,使用客户端标识符、客户端密钥、授权码等参数向 token 端点发送请求以获取访问令牌。

Restful API 是一种基于 HTTP 协议设计 Web 服务接口的架构风格。它是面向资源的,通过 HTTP 动词实现对资源的操作。常见的 HTTP 动词有 GET、POST、PUT、PATCH 和 DELETE。

在 Golang 中实现 Restful API 需要用到 net/http 包,通过 http.ListenAndServe 函数开启服务监听指定端口。定义路由规则并实现具体业务逻辑即可。

例如下面这个简单的示例代码:

package mainimport ("encoding/json""log""net/http"
)type User struct {ID   int    `json:"id"`Name string `json:"name"`
}var users []Userfunc getUsers(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(users)
}func addUser(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")var user User_ = json.NewDecoder(r.Body).Decode(&user)users = append(users, user)json.NewEncoder(w).Encode(user)
}func main() {users = []User{{ID: 1, Name: "Alice"},{ID: 2, Name: "Bob"},{ID: 3, Name: "Charlie"},}http.HandleFunc("/users", getUsers).Methods("GET")http.HandleFunc("/users", addUser).Methods("POST")log.Fatal(http.ListenAndServe(":8080", nil))
}

以上示例代码实现了获取用户列表和新增用户的功能,使用 JSON 格式进行数据交互。

四,go OAuth2.0第三方登录应用

下面是基于 Golang 实现 OAuth2.0 第三方登录应用的简单示例。

首先,需要引入 golang.org/x/oauth2 包和相关第三方提供商的包。例如使用 Google 作为 OAuth2.0 提供商,则需要引入 golang.org/x/oauth2/google 包。

接着,在代码中配置 OAuth2.0 客户端并设置回调 URL。回调 URL 是授权服务器授权后重定向回本应用的 URL。同时定义处理回调请求的 Handler 函数,并在其中实现获取用户信息等业务逻辑。

最后,开启 HTTP 服务监听指定端口,将客户端请求转发到对应 Handler 处理即可。

package mainimport ("context""encoding/json""fmt""log""net/http""golang.org/x/oauth2""golang.org/x/oauth2/google"
)var oauthConfig = &oauth2.Config{ClientID:     "your-client-id",ClientSecret: "your-client-secret",RedirectURL:  "http://localhost:8080/callback",Scopes: []string{"https://www.googleapis.com/auth/userinfo.email",},Endpoint: google.Endpoint,
}func handleMain(w http.ResponseWriter, r *http.Request) {url := oauthConfig.AuthCodeURL("state")http.Redirect(w, r, url, http.StatusTemporaryRedirect)
}func handleCallback(w http.ResponseWriter, r *http.Request) {code := r.FormValue("code")token, err := oauthConfig.Exchange(context.Background(), code)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}resp, err := http.Get(fmt.Sprintf("https://www.googleapis.com/oauth2/v2/userinfo?access_token=%s", token.AccessToken))if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer resp.Body.Close()var user struct {Email string `json:"email"`}err = json.NewDecoder(resp.Body).Decode(&user)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}fmt.Fprintf(w, "Hello %s!", user.Email)
}func main() {http.HandleFunc("/", handleMain)http.HandleFunc("/callback", handleCallback)log.Fatal(http.ListenAndServe(":8080", nil))
}

以上示例代码使用 Google 作为 OAuth2.0 提供商,实现了获取用户邮箱信息的功能。其他第三方提供商的实现方式类似,只需要修改配置和请求 URL 即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android adb shell 查看App内存(java堆内存/vss虚拟内存/详细的内存状况/内存快照hprof)和系统可用内存

1.adb shell 获取app 进程的pid adb shell "ps|grep com.xxx包名"根据某个渠道包&#xff0c;去查询对应的pid&#xff0c;如下所示&#xff1a; 2.通过adb shell 查看设备的java dalvik 堆内存的最大值 执行命令行&#xff1a; adb shell getprop dalvik.vm.h…

iOS开发-实现获取下载主题配置动态切换主题

iOS开发-实现获取下载主题配置动态切换主题 iOS开发-实现获取下载主题配置更切换主题&#xff0c;主要是通过请求服务端配置的主题配置、下载主题、解压保存到本地。通知界面获取对应的图片及颜色等。 比如新年主题风格&#xff0c;常见的背景显示红色氛围图片、tabbar显示新…

深度学习:梯度裁剪的理解

深度学习&#xff1a;梯度裁剪的理解 梯度裁剪简介设置范围值裁剪通过 L2 范数裁剪 附 在深度学习领域&#xff0c;梯度裁剪是一个常用的技巧&#xff0c;用于防止梯度过小或过大。下面简单介绍一下 梯度裁剪的原理与方法。 梯度裁剪简介 在深度学习模型的训练过程中&#xf…

记录springboot在k8s下无法读取文件问题

//加载配置文件 File file ResourceUtils.getFile("classpath:/template/job.yaml"); /对象映射 V1Job v1Job (V1Job) Yaml.load(file); 开发的时候使用上面的方法可以读取文件数据&#xff0c;但是部署到k8s容器中之后&#xff0c;读取文件出现报错&#xff0c…

[游戏数值] 常用刷新次数钻石消耗的设计

需满足要求 以一定规律增加能够在较少次数内增加到较大数值平滑增长 设计思路 增加值INT((当前序号-1)/X)*YZ X2&#xff0c;表示希望几个一组&#xff0c;通过INT()取整可获得0、0、1、1、2、2…这样的序列Y10&#xff0c;表示基础值&#xff0c;将上述序列变为0、0、10、1…

微信小程序插件 painter 生成海报、二维码

GitHub 地址&#xff1a;https://github.com/Kujiale-Mobile/Painter 一、引入 将 components/painter 整个文件放到自己项目的 components 中&#xff1b;以组件的形式在页面的 json 文件中引入&#xff1b; 二、使用 <view class"container"><image s…

REST API的基础:HTTP

在本文中&#xff0c;我们将深入探讨万维网数据通信的基础 - HTTP。 什么是超文本&#xff1f; HTTP&#xff08;超文本传输协议&#xff09;的命名源于“超文本”。 那么&#xff0c;什么是超文本&#xff1f; 想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我…

Restful的详细介绍~

RESTFUL简介&#xff1a; Restful是我们看待服务器的一种方式&#xff0c;我们都知道Java一切皆对象&#xff0c;因此在Java中&#xff0c;我们可以将所有的内容都看成对象&#xff0c;而在这里&#xff0c;RESTFUL是我们看待服务器的一种方式&#xff0c;我们可将服务器中的所…

C语言的链表操作

C语言中可以使用结构体和指针实现链表操作。链表是一种动态数据结构,由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。以下是一个简单的示例: #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 struct Node {int data;struct No…

【C++】多态的实现及其底层原理

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、什么是多态&#xff1f;二、多态的构成条件2.1什么是虚函数&#xff1f;2.2虚函数的重写2…

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…

【深度学习】WaveMix: A Resource-efficient Neural Network for Image Analysis 论文

论文&#xff1a;https://arxiv.org/abs/2205.14375 代码&#xff1a;https://github.com/pranavphoenix/WaveMix 文章目录 ABSTRACTIntroductionBackground and Related WorksWaveMix Architectural FrameworkOverall architectureWaveMix block Experiments and ResultsTasks…

机器学习深度学习——Dropout

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——权重衰减 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 Drop…

ffmpeg常用功能博客导航

FFmpeg 是一个处理视频和音频内容的开源工具库&#xff0c;可以实现编码、解码、转码、流媒体和后处理等服务。 推荐博客&#xff1a; 常见命令和使用案例 用ffmpeg转mov为mp4格式 FFmpeg 常用命令 FFmpeg 常用命令编辑音/视频&#xff08;转换格式、压缩、裁剪、截图、切分合…

centos7安装nginx

一、下载安装包 方式一&#xff1a;官网下载 到nginx官网下载 然后上传到linux 服务器 方式二: wget 下载 wget http://nginx.org/download/nginx-1.22.0.tar.gz二、安装nginx 先安装相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 创建…

什么是 ASP.NET Core SignalR?

所有连接了 Internet 的应用程序都由服务器和客户端组成。 客户端依赖于服务器获取数据&#xff0c;而它们获取数据的主要机制是通过发出超文本传输协议 (HTTP) 请求来进行的。 某些客户端应用程序需要经常更改的数据。 ASP.NET Core SignalR 提供了一个 API&#xff0c;用于创…

(三)4. 深度生成模型-扩散模型(基于扩散的生成模型与分数匹配的变分视角)

“基于扩散的生成模型”与“分数匹配”的变分视角 1. 介绍1.1. 变分自动编码器1.2. 基于扩散的建模1.3. 主要内容2. 基于得分的随机微分方程生成建模基于离散时间扩散的生成模型和分数匹配方法在高维图像数据建模方面显示出了良好的效果。 最近,Song等人(2021)表明,通过学…

(Python):元类(metaclass), Type类,类实例,dataclass

文章目录 类实例类成员变量与成员变量的区别 Type类MetaclassABCMeta dataclass 类实例 在python中&#xff0c;所有的类都是一个实例&#xff0c;也就是说&#xff0c;所有的类其实都是由自己的属性和方法的。 这里就需要区分清楚一件事&#xff0c;类实例和对象。类实例指的…

使用vim-cmd工具给ESXi虚机定期打快照

VMware虚拟化 - 建设篇 第四章 使用vim-cmd工具给ESXi虚机定期打快照 VMware虚拟化 - 建设篇系列文章回顾使用vim-cmd工具给ESXi虚机定期打快照前言前提条件ESXi新增执行快照备份的sh脚本ESXi添加crond任务并使其生效ESXi指定部分虚拟机不执行定期快照(附加)虚拟机自定义属性…

ChatGPT有几个版本,哪个版本最强,如何选择适合自己的?

​ChatGPT就像内容生产界的瑞士军刀。它可以是数学导师、治疗师、职业顾问、编程助手&#xff0c;甚至是旅行指南。只要你知道如何让它做你想做的事&#xff0c;ChatGPT几乎可以提供你要的任何东西。 但重要的是&#xff0c;你知道哪个版本的ChatGPT最能满足你的需求吗&#x…