让我们追踪一下Oauth-xyz-nodejs的处理流程

我运行了一个名为XYZ的认证协议的参考实现,并跟踪了它的处理过程,以下是我的记录。

这是截至2020年2月的参考实现内容。未来可能会对实现进行更改,但反过来说,即使XYZ的规范发生变化,实现也可能不会更新。

这是一个只需要一个选项的题目。

据说,XYZ是基于事务模型的认证协议。它不是OAuth 2.0的扩展,而是对OAuth 2.0要求进行整理并重新定义的协议。

XYZ: 交易授权

非常感谢那些提供这些信息的人,我在阅读本次XYZ参考实现时参考了以下文章。

    • Transactional Authorization – “XYZ”と呼ばれる認可プロトコルとは – r-weblife

 

    OAuth 3.0? Transactional Authorization – XYZを動かしてみる – Qiita

移动的物品

我选择了TypeScript(Node.js + Express)的参考实现作为目标。

安全钥匙/oauth-xyz-nodejs

已经准备好了Client和AuthZ服务器,Client进一步分为前端Web和后端API。从外部注入请求参数和JWK的工具功能上看,Web似乎只是作为一个工具,而实际扮演Client角色的似乎只有API。

我操作了它,并确认了自己实际操作的内容是如何处理的。

顺便提一下,处理流程大致分为两个部分——“重定向交易”和“设备交易”。而我这次只对“重定向交易”进行了操作并确认了处理内容。

执行操作

使用docker-compose运行并访问https://localhost:5000,将显示初始页面。
点击页面底部的“新的重定向事务”,然后连续点击“获取事务”。

localhost_5000_.png

然后,屏幕下方会显示交易信息。
在此屏幕上方右上角的日志项目上点击“轮询”。

スクリーンショット 2020-02-28 8.53.45.png

更新过的交易信息将被进一步添加到下方。

スクリーンショット 2020-02-28 8.55.33.png

接下来,在Interaction URL的同意页面中,点击“批准”。

スクリーンショット 2020-02-28 8.57.30.png

当通过回调返回到初始画面时,再次点击“获取交易”将在屏幕上显示访问令牌。

スクリーンショット 2020-02-28 8.56.26.png

我追踪了这一系列操作的处理流程。

顺序图

按照上述操作的数据流程,以下是我根据参考实现的代码所绘制的序列图。

oauth-xyz-nodejs.png

客户端向授权服务器发送请求的各种参数,例如”重定向主体”和”客户端 JWK”,直接使用初始界面上显示的内容,无需进行修改。

因为只是以个人对代码的直接阅读笔记为基础,所以序列图的绘制方法也是随意的,所以可能会很难理解,请多多包涵…
如果有任何错误之处,请指出,我会很高兴的。

对于读了代码的感想

    • AS側のエンドポイントがOAuth 2.0と比べてだいぶ少ない。

Redirect Transactionだと/transactionと/interactぐらいしか使ってない。

/transactionにアクセスするたびにHandleがクルクルと更新される。

Clientが現在のHandleの値を見失ったら最初からやり直し?
途中でエラーとか起きたりした場合、エラーレスポンスにはHandleが含まれないので、Clientは新しいTransactionを開始する必要がある。で良いみたい。

Redirect Transactionの流れを確認するだけだったら「Poll」をクリックするくだりは必要なかったかも。
ASでもnonceを作成している。Clientが適当なnonceを指定してくることに対するカウンター的な意味合い?

Clientはclient_noce, server_noce, interact_handleを結合したもののHash値を検証している。
Clientが検証しなかったら意味無いのはOIDCと同様?

ASはTransactionだけではなく、display, user, resource, keysにもHandleを設定し保存する。

以降、Clientがdisplay, user, resource, keysにHandleの値だけ設定してリクエストしてきてもAS側は処理可能。
Transactionが継続している間だけ有効なOAuth 2.0 Pushed Authorization Requestsをやってるイメージかな。

このリファレンス実装ではPresentation Types(?)はjwsdだけが実装されている。

公式サイトのkeysによるといろいろなタイプがあるみたい。

jwsd:Detached JSON Web Signature

httpsig:HTTP Request Signature (Cavage signatures)

dpop:Demonstration of Proof of Possession

pop:OAuth Proof of Posession

mtls:Mutual TLS

ASは最初のTransactionが始まるときに公開鍵を保存しておき、以降のリクエストはその公開鍵を使ってDetached-JWSを検証をすることで進行中のTransactionにおけるClientの正当性を確認している。
TokenのRefreshは未実装。

ASの/transactionのコードに「refresh token?」とコメントがあるのでここで実装される想定?

      switch (tx.status) {
        case 'authorized':
          ...
        case 'issued':
          // refresh token?
          await tx.save();
          return res.status(403).send({
            message: 'Access token has already been issued for this transaction'
          });
        case 'waiting':
          ...
        case 'denied':
          ...
        case 'new':
          ...
        default:
          return res.status(500);
      }

    • TokenのRefreshがサポートされるとして、その場合Transactionのステータス管理はどうなるんだろう。

issuedのまま続ける?issuedの次のステータスが定義される?


将来什么时候会有一天XYZ会取代OAuth 2.0被广泛使用呢?为了不被落下,我希望能更加努力学习。

广告
将在 10 秒后关闭
bannerAds