前言
这里是OAuth2.0协议的学习及实现基于github的第三方登录
提示:以下是本篇文章正文内容,下面案例可供参考
一、OAuth2.0是什么?
OAuth 2.0(Open Authorization 2.0)是一种授权框架,是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。
要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限,允许程序访问用户在另一个服务提供者上托管的资源,而无需共享用户的凭据(例如用户名和密码)。同时为Web应用,桌面应用和手机,和智能家居设备提供专门的认证流程。
它已成为许多网络服务的标准授权协议,包括社交媒体平台、云存储服务、支付系统等。
OAuth 2.0的设计重点是简化客户端开发并提高安全性。
二、OAuth 2.0的核心组件
-
资源所有者(Resource Owner):拥有受保护资源的用户。该用户授予客户端对其资源的访问权限。
-
客户端(Client):第三方应用程序,希望访问资源所有者的受保护资源。它可以是网站、移动应用程序或其他类型的应用程序。
-
授权服务器(Authorization Server):负责认证资源所有者并颁发访问令牌给客户端。这是OAuth 2.0流程的核心组件之一。
-
资源服务器(Resource Server):托管受保护资源的服务器。客户端通过访问令牌与资源服务器通信以访问资源。
Oauth2的角色
OAuth2协议包含几种角色:Client(客户端)、Resource Owner(资源拥有者)、Authorization Server(认证服务器)、Resource Server(资源服务器)。
Resource owner 资源拥有者(用户):能够授予对受保护资源的访问权限的实体。当资源所有者是一个人时,它被称为最终用户
Resource Server 资源服务器:托管受保护资源的服务器,能够使用访问令牌接受和响应受保护资源请求。
Client 客户端:代表资源所有者并经其授权发出受保护资源请求的应用程序。
Authorization server 授权服务器:服务器在成功验证资源所有者并获得授权后向客户端颁发访问令牌。授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以是与资源服务器相同的服务器,也可以是单独的实体。 单个授权服务器可以发布多个资源服务器接受的访问令牌。
OAuth 2.0的工作流程:
-
客户端注册:客户端向授权服务器注册,并提供其身份验证信息,如客户端ID和客户端秘钥。
-
授权请求:客户端请求授权服务器授权,以访问资源所有者的受保护资源。
-
用户身份验证:授权服务器验证资源所有者的身份,并要求资源所有者授予客户端请求的权限。
-
授权授予:如果资源所有者同意授予客户端请求的权限,则授权服务器生成授权码或访问令牌,并将其发送回客户端。
-
令牌颁发:客户端收到授权码或访问令牌后,使用其私有密钥向授权服务器请求令牌。
-
访问令牌使用:客户端使用访问令牌向资源服务器请求受保护资源。资源服务器验证令牌,并根据其有效性决定是否授予对资源的访问权限。
-
访问资源:如果访问令牌有效且授权给客户端访问特定资源,则资源服务器向客户端提供所请求的资源。
OAuth 2.0的授权类型:
-
授权码授权(Authorization Code Grant):用于Web应用程序,客户端通过重定向将用户导向授权服务器,在授权后获取授权码,然后使用该授权码交换访问令牌。
-
隐式授权(Implicit Grant):用于移动和Web应用程序,直接将访问令牌传递给客户端,而不是通过授权码交换。
-
密码授权(Resource Owner Password Credentials Grant):用户直接将其凭据(用户名和密码)提供给客户端,客户端使用这些凭据向授权服务器请求访问令牌。
-
客户端凭证授权(Client Credentials Grant):适用于客户端自身需要访问资源的情况,而不是代表用户。
-
刷新令牌(Refresh Token):用于获取新的访问令牌,以便客户端可以持续访问受保护资源,而无需用户重新登录。
OAuth 2.0是一个灵活且功能强大的授权框架,通过支持不同类型的客户端和授权流程,使得开发者可以在不牺牲安全性的情况下实现对用户资源的安全访问。
go web结合Github做auth认证(官方文档)
-
先到官网上注册一个application:Sign in to GitHub · GitHub
-
只有callback地址比较重要,其他的不影响认证流程,得到cliendt_id和client_Secret,cliendt_id是GitHub用来标识APP的,client_secret获取access_token时用到。
-
客户端请求(引导)用户授权,允许用户点击Login with Github使用Github进行登录
-
func main() { // 路由设置 http.HandleFunc("/", IndexHandler) // 首页,提供登录链接 http.HandleFunc("/login", LoginHandler) // 处理用户点击登录链接,重定向到 GitHub 授权页面 http.HandleFunc("/callback", CallbackHandler) // GitHub 回调处理,获取 access token // 启动服务 if err := http.ListenAndServe("localhost:8080", nil); err != nil { log.Fatalln("could not start server:", err.Error()) return } //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 //code=0f9f8596d68991e2219b } // IndexHandler 函数,渲染登录页面的handler func IndexHandler(w http.ResponseWriter, r *http.Request) { // 构造简单的html文本,包含一个链接,用于用户通过 Github 登录 templates := `<html><body><a href="/login">Login with Github</a></body></html>` // 写入响应并捕获错误 if _, err := fmt.Fprintln(w, templates); err != nil { log.Fatalln("error:", err.Error()) } } // LoginHandler 函数,用于处理 OAuth2.0 登录请求 func LoginHandler(w http.ResponseWriter, r *http.Request) { // 创建一个 URL 参数的实例来构建查询字符串 query := url.Values{} // 设置 GitHub OAuth 的客户端 ID query.Set("client_id", ClientID) // 解析 GitHub OAuth 授权端点的 URL u, err := url.ParseRequestURI(AuthorizeUrl) // 如果解析失败,返回 500 错误 if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 将查询字符串编码并附加到 URL 上 u.RawQuery = query.Encode() // 使用 307 状态码重定向用户到 GitHub 的授权页面 http.Redirect(w, r, u.String(), http.StatusTemporaryRedirect) }
5.运行效果:
总结
用户安全性: OAuth 2.0允许用户授权第三方应用程序访问其受保护的资源,而无需共享其凭据(例如用户名和密码)。这样可以大大降低用户的安全风险,因为用户不必将其敏感凭据直接提供给第三方应用程序。
用户体验: OAuth 2.0通过简化用户授权过程,提供了更好的用户体验。相比传统的用户名和密码验证,OAuth 2.0使得用户无需在每个第三方应用程序中输入其凭据,而只需在授权服务器上一次性授权即可。这大大简化了用户的操作流程,提高了用户体验。
以上就是我对OAuth2.0的一些学习记录。求收藏!求点赞! 求关注啊!!!