Oauth2

news/2024/12/2 10:05:04/

目录

  • 引入
  • Oauth2概念
  • Oauth2的角色
  • Oauth2 的四种认证模式
    • 授权码模式
    • 简化模式 (隐式授权模式)
    • 密码形式
    • 客户端模式
  • go web结合Github做auth认证([官方文档](https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps))
  • 参考文献

第三方登录是应用开发中的常用功能,通过第三方登录,可以更加容易的吸引用户来到我们的应用中。现在,很多网站都提供了第三方登录的功能,在他们的官网中,都提供了如何接入第三方登录的文档。

大多数网站提供的第三方登录都遵循OAuth协议,虽然大多数网站的细节处理都是不一致的,甚至会基于OAuth协议进行扩展,但大体上其流程是一定的。

引入

场景:快递员进入小区,被门禁系统拦截。

  1. 如果用户把自己的密码,告诉快递员,他就拥有了与用户同样的权限,危险较大,用户如果想取消他进入小区的权力,需要把自己的密码也得跟着改了,还得通知其他的快递员。

  2. 有没有一种办法,让快递员能够自由进入小区,又不必知道小区居民的密码。

授权机制的设计:

  1. 第一步,门禁系统的auth增加一个按钮,叫做"获取授权",快递员需要首先按这个按钮,去申请授权。

  2. 第二步,他按下按钮以后,屋主的手机就会跳出对话框:有人正在要求授权,系统还会显示该快递员的姓名、工号和所属的快递公司。

  3. 屋主确认请求属实,就点击按钮,告诉门禁系统,同意给予他进入小区的授权。

  4. 第三步,门禁系统得到的确认以后,向快递员显示一个进入小区的令牌(access token),只在短期内(比如七天)有效。

  5. 第四步,快递员向门禁系统输入令牌,进入小区。

为什么不是远程为快递员开门,而要为他单独生成一个令牌?这是因为快递员可能每天都会来送货,第二天他还可以复用这个令牌,另外,有的小区有多重门禁,快递员可以使用同一个令牌通过它们。

Oauth2概念

  1. OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问用户存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享用户数据的所有内容。
  2. OAuth在全世界得到广泛应用,目前的版本是2.0版。
  3. OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。

Oauth2的角色

OAuth2协议包含几种角色:Client(客户端)、Resource Owner(资源拥有者)、Authorization Server(认证服务器)、Resource Server(资源服务器)。

  • Resource owner 资源拥有者(用户):能够授予对受保护资源的访问权限的实体。当资源所有者是一个人时,它被称为最终用户

  • Resource Server 资源服务器:托管受保护资源的服务器,能够使用访问令牌接受和响应受保护资源请求。

  • Client 客户端:代表资源所有者并经其授权发出受保护资源请求的应用程序。

  • Authorization server 授权服务器:服务器在成功验证资源所有者并获得授权后向客户端颁发访问令牌。授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以是与资源服务器相同的服务器,也可以是单独的实体。 单个授权服务器可以发布多个资源服务器接受的访问令牌。

在这里插入图片描述

白话来讲:

  1. Client 客户端,即我们的应用就是一个Client。
  2. Resource Owner 资源所有者,即用户。
  3. Authorization Server 授权服务器,即提供第三方登录服务的服务器,如Github,Google。
  4. Resource Server 拥有资源信息的服务器,通常和授权服务器属于同一应用。

根据上图的信息,可以知道OAuth2的基本流程为:

  1. 客户端请求(引导)用户授权。
  2. 用户同意授权,并返回一个凭证(code)
  3. 客户端通过第二步的凭证(code)向授权服务器请求授权
  4. 授权服务器验证凭证(code)通过后,同意授权,并返回一个资源访问的凭证(Access Token)。
  5. 客户端通过第四步的凭证(Access Token)向资源服务器请求相关资源。
  6. 资源服务器验证凭证(Access Token)通过后,将客户端请求的资源返回。

Oauth2 的四种认证模式

  1. 授权码模式:常见的第三方平台登录功能基本都是使用这种模式。
  2. 简化模式:简化模式是不需要客户端服务器参与,直接在浏览器中向授权服务器申请令牌(token),一般如果网站是纯静态页面则可以采用这种方式。
  3. 密码形式:密码模式是用户把用户名密码直接告诉客户端,客户端使用说这些信息向授权服务器申请令牌(token)。
  4. 客户端模式:客户端模式是指客户端使用自己的名义而不是用户的名义向服务提供者申请授权。

授权码模式

这种方式是最常用的流程,安全性也最高。

在这里插入图片描述

简化模式 (隐式授权模式)

有些 Web 应用是纯前端应用,没有后端,这时就不能用上面的方式了,必须将令牌储存在前端。

RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)。

在这里插入图片描述

密码形式

如果高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用去申请令牌,这种方式称为"密码式"(password)。
在这里插入图片描述

客户端模式

有的应用可能没有前端页面,就是一个后台。
在这里插入图片描述
在这个过程中好像没有用户什么事了,客户端模式给出的令牌,就是针对第三方应用的,而不是针对用户的。

go web结合Github做auth认证(官方文档)

  1. 先到官网上注册一个application:https://github.com/settings/developers
    在这里插入图片描述
    只有callback地址比较重要,其他的不影响认证流程:

    在这里插入图片描述

  2. 得到cliendt_id和client_Secret,cliendt_id是GitHub用来标识APP的,client_secret获取access_token时用到。

  3. 流程1:客户端请求(引导)用户授权,允许用户点击Login with Github使用Github进行登录

    package mainimport ("fmt""io""log""net/http""net/url""strings"
    )var (clientID       = ""clientSecrets  = ""githubAuthApi  = "https://github.com/login/oauth/authorize"githubTokenApi = "https://github.com/login/oauth/access_token"
    )func main() {http.HandleFunc("/", IndexHandler)http.HandleFunc("/login", LoginHandler)http.HandleFunc("/callback", CallbackHandler)if err := http.ListenAndServe("localhost:8080", nil); err != nil {log.Fatalln("could not start server:", err.Error())}
    }func IndexHandler(w http.ResponseWriter, r *http.Request) {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())}
    }func LoginHandler(w http.ResponseWriter, r *http.Request) {// redirect到githubquery := url.Values{}query.Set("client_id", clientID)u, err := url.ParseRequestURI(githubAuthApi)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 拼接get请求u.RawQuery = query.Encode()http.Redirect(w, r, u.String(), http.StatusTemporaryRedirect)
    }
    
  4. 流程2:用户进行github的权限校验,允许授权,github会跳转到既定的地址,并且将code传入

  5. 流程3:客户端通过第二步的凭证(code)向授权服务器请求授权,流程4:授权服务器验证凭证(code)通过后,同意授权,并返回一个资源访问的凭证(Access Token)。

    func CallbackHandler(w http.ResponseWriter, r *http.Request) {// 接收github回调code := r.FormValue("code")formData := url.Values{}formData.Set("client_id", clientID)formData.Set("client_secret", clientSecrets)formData.Set("code", code)request, err := http.NewRequest(http.MethodPost, githubTokenApi, strings.NewReader(formData.Encode()))if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}request.Header.Set("Accept", "application/json")resp, err := http.DefaultClient.Do(request)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 关闭bodydefer func(Body io.ReadCloser) {err = Body.Close()if err != nil {log.Println(err)}}(resp.Body)content, err := io.ReadAll(resp.Body)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}_, err = w.Write(content)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}
    }
    

    在这里插入图片描述

  6. 使用access_token获取用户信息:

    // 添加头信息
    Authorization: Bearer OAUTH-TOKEN
    // 用户接口
    GET https://api.github.com/user
    

    在这里插入图片描述

参考文献

  1. [1] 江南一点雨.做微服务绕不过的 OAuth2,松哥也来和大家扯一扯.
  2. [2] 我就是个菜鸟2021.oauth2基本概念
  3. [3] Java鱼仔.Oauth2是个什么东西?

http://www.ppmy.cn/news/188908.html

相关文章

小米8位置服务器,超旗舰新机小米8,强大的GPS定位无人能及!

原标题&#xff1a;超旗舰新机小米8&#xff0c;强大的GPS定位无人能及&#xff01; 明明定位在小区门口&#xff0c;滴滴司机却经常找不到地方。如果碰上赶时间的急事&#xff0c;打车体验就更差了。有人说是滴滴导航定位不准&#xff0c;其实是错怪了它。 打车软件的定位问题…

小米5手机位置服务器,互联网信息:小米5手机配置曝光 配5.3英寸屏搭载骁龙820处理器...

新时代高科技不计其数越来越发达&#xff0c;小伙伴们看过不少科技新闻吧&#xff0c;在我们生活中应该也用到很多这些高科技东西&#xff0c;有哪些小伙伴值的关注的呢&#xff0c;今天就跟大家分享一篇有关科技方面知识&#xff0c;希望大家会喜欢。 今天早些时候&#xff0c…

联通4g 小米不显示无服务器,小米旗舰机断流严重,信号满格消息却发不出去?...

刚刷到这样一个视频&#xff0c;点进去看了下&#xff0c;发现是Redmi K30至尊版&#xff0c;而且是换过货后的新手机。看了PO主的测试&#xff0c;4G网络信号下QQ、微信确实无法发出消息&#xff0c;开启发行模式再关也发不了&#xff0c;只有关了5G再开后才正常。这个视频引来…

小米android7.1机型,心目中最牛逼的小米旗舰机:支持安卓7.1+骁龙801

原标题&#xff1a;心目中最牛逼的小米旗舰机&#xff1a;支持安卓7.1骁龙801 小米手机&#xff0c;最具性价比的一个手机品牌&#xff0c;这段时间因为小米6强大的配置骁龙835加上玻璃、陶瓷机身等&#xff0c;而且关键是价格还不高&#xff0c;因此受到大家的热捧&#xff0c…

红米K50配置出炉,红米旗舰对小米有何影响?

从去年就开始预告的红米K50 终于千呼万唤始出来&#xff0c;作为红米品牌最新旗舰手机&#xff0c;此前人们对于它有太多的猜测&#xff0c;比如说为什么一定要在小米 12 上市之后才发布。从配置方面来看&#xff0c;我们看到了卢伟冰的野心&#xff0c;他渴望将红米品牌的品质…

小米4c android n,与小米4C截然相反的旗舰之路

原标题&#xff1a;与小米4C截然相反的旗舰之路 前瞻科技快讯&#xff0c;联想昨晚正式发布乐檬 X3&#xff0c;售价达到了 2499 元和 2999 元&#xff0c;青春版的价格为 1899 元&#xff0c;和外界猜测的火拼小米 4C 有相当大的反差&#xff0c;整体上比小米 4C 高出了一千多…

2018android旗舰手机,七款2018年安卓旗舰手机剖析,绕过手机上的坑,做一个精明消费者...

原标题&#xff1a;七款2018年安卓旗舰手机剖析&#xff0c;绕过手机上的坑&#xff0c;做一个精明消费者 2018年不少安卓旗舰手机发布&#xff0c;当中有不少创新产品&#xff0c;但同时也伴随着一些坑&#xff0c;希望看完这篇文章后&#xff0c;你可以绕过某些手机上的坑&am…

2017android 最强旗舰,2017年旗舰机大比拼 小米第四 第一名毫无争议

现如今在手机领域&#xff0c;每一年手机厂商的旗舰机型都颇受关注&#xff0c;尤其是诸如苹果、三星这样国际品牌&#xff0c;而国内品牌随着华为、小米等迅速崛起&#xff0c;国产品牌的旗舰机同样受人期待&#xff0c;进入2017年&#xff0c;各家手机厂商也是摩拳擦掌&#…