让我们追踪一下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,将显示初始页面。
点击页面底部的“新的重定向事务”,然后连续点击“获取事务”。
然后,屏幕下方会显示交易信息。
在此屏幕上方右上角的日志项目上点击“轮询”。
更新过的交易信息将被进一步添加到下方。
接下来,在Interaction URL的同意页面中,点击“批准”。
当通过回调返回到初始画面时,再次点击“获取交易”将在屏幕上显示访问令牌。
我追踪了这一系列操作的处理流程。
顺序图
按照上述操作的数据流程,以下是我根据参考实现的代码所绘制的序列图。
客户端向授权服务器发送请求的各种参数,例如”重定向主体”和”客户端 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被广泛使用呢?为了不被落下,我希望能更加努力学习。