Day13 - 【概念篇】OAuth flows: Password Grant (Legacy)

本系列文之後也会置於个人网站


首先,先来看看直接使用帐号密码授权的。

是的, OAuth 是有一个模式支援直接使用帐号密码的。与万能钥匙不太一样的是,授权的结果仍然是由授权服务器的权杖和资源服务器决定。尽管透过中央授权控制可以限制存取权杖可以做些什麽,但毕竟直接使用帐号密码并不是特别好,故在其他模式下都不适用时,才应该再考虑此模式。


     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+

            Figure 5: Resource Owner Password Credentials Flow

事前准备

安装RESTer

首先先替浏览器安装RESTer插件。FirefoxChrome都可以找得到。至於其他浏览器就要自己找找看或使用Postmam、Curl之类的工具。

建立一个可以使用密码模式的客户端

先前建立的my-quick-start-app并不支援这个模式,主要是因爲开啓了Consent Required。上面说道password模式主要授权方式爲中央授权控制,也就是前几天提到的白名单。而my-quick-start-app建立的是灰名单的客户端。所以我们得在建立一个,就叫flow-experiment-1吧!

然後Consent Required维持禁用;Direct Access Grants Enabled维持啓用

透过RESTer与密码模式取得存取权杖

开啓RESTer并依下图填入资讯。
(使用POST方法打endpoint - http://localhost:8080/auth/realms/quick-start/protocol/openid-connect/token )

此外Content-Type必须是application/x-www-form-urlencoded。在之後几个模式都是如此,也就不会再特别提及。

最後填上我们要使用的模式、帐号/密码、要授权的客户端和需要的授权范围。

  • grant_type: password
  • username: bob
  • password: password
  • client_id: flow-experiment-1
  • scope: email profile

如果你使用Curl,可以透过以下命令执行:

curl -X POST http://localhost:8080/auth/realms/quick-start/protocol/openid-connect/token \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    -d 'grant_type=password&username=bob&password=password&client_id=flow-experiment-1'

最後就会得到以下结果

理解结果

对於结果,目前只会简单说明三个部分access_tokenrefresh_tokentoken_type

关於access_token应该也不用太说什麽,它就是资源服务器会认的权杖。在取用资源时会需要同时给资源服务器做验证授权。此外,OAuth并没有特别说明存取权杖的格式,而这里的格式是之後会介绍的JWT。token_type则说明了这是一个Bearer权杖,需要使用Bearer的方式进行验证授权。更详细部分之後才会提到。

然後是refresh_token。这个返回值是可选的,授权服务器可能不会返回其值。除了有可能只允许此一次授权外,另一个原因是本身就可以使用帐号密码的话,并不需要使用refresh_token。如前所述,直接使用帐号密码并不是特别好的方式,所以通常的做法应该只会使用一次帐号密码,使用後客户端会立刻忘记该资讯。之後就都使用refresh_token,并使用之後同样会提到的另一个模式 -- Refresh Token Flow

参考资料


<<:  [2021铁人赛 Day14] General Skills 11

>>:  Day 23: Recurrent Neural Network — 循环精神网路初探(下)

伪类与伪元素-30天学会HTML+CSS,制作精美网站

昨天介绍了各种选择器,今天介绍伪类及伪元素样式设定,可以让画面有更多的样式变化,也减少html co...

Day9 自订开机执行的程序码 - 函数宣告与语法糖

前面几天,我探索了 Lua 的变数型别、条件判断、回圈、标准函式库等 在这过程中,我已经多少看过函数...

Day 8:工欲善其事,必先利其器,准备好Gradle依赖

Keyword: KMM Gradle,Kotlinx serialization 到Day9使用K...

30天学会C语言: Day 0-第一篇不免俗的要来些基础知识

所以我说...程序是虾饺? 程序是可以直接在电脑上执行,以完成某个目的或任务的一连串指令 换句话说,...

AAC 转档 MP3

对於AAC 这个音讯格式,可能大多数人都不太熟悉。但是AAC 是 iTunes 里常见的音乐档案格式...