はじめに
AWSのCognitoを触る機会があり、ドキュメントには見慣れないOAuthの文字が…
OAuthについて調べるべく、「OAuth徹底入門 セキュアな認可システムを適用するための原則と実践」を読んでみました。
※追記
2020/09/19:TakahikoKawasaki様からのコメントを参考にし、protectedResource.jsのコードを修正しました。
サンプルコードについて
記事の内容はOAuthとは何かから、具体的な実装方法まで書かれているためとても勉強になっています。
ただサンプルコードはNode.js v4.4.1 (+ Express)で記載されているため、LTSの12.18.3(2020/9/15)では動かない…
これが本当に厄介で、OAuthについて学びたいのに、本質的ではないコードの修正に時間が取られてしまう。
ただ、私自身Node.jsも勉強したいと思っていたため、動くようにコードを修正しました。良ければ参考にして本質的なOAuthの勉強に時間を割いてもらえればと思います。
実行環境
$ node -v
v12.18.3
$ npm -v
6.14.6
ch-3-ex-1
ここでの目的は以下の通りです。
シンプルなOAuthクライアントを構築し、認可コードによる付与方式(Authorization Code Grant Type)を使って認可サーバーからトークンの種類がBearerトークンであるアクセストークンを取得し、そして、そのトークンを保護対象リソースに対して使うようにしてきます。
つまり、クライアントが認可サーバからBearerトークンを取得し、そのBearerトークンを元に保護対象リソースにアクセスできることが今回のゴールです。
修正したコードはgithubにあげる予定のため、ここではそれぞれのサンプルコードフォルダの変更点のみ記載します。(client.jsのみフォルダ内completedとの比較になります。)
-var encodeClientCredentials = function(clientId, clientSecret) {
- return new Buffer(querystring.escape(clientId) + ':' + querystring.escape(clientSecret)).toString('base64');
+var encodeClientCredentials = function (clientId, clientSecret) {
+ // new Bufferは非推奨のため、Buffer.fromを利用
+ return Buffer.from(querystring.escape(clientId) + ':' + querystring.escape(clientSecret)).toString('base64');
- var clientCredentials = new Buffer(auth.slice('basic .length),base64').toString().split(':');
+ // new Bufferは非推奨のため、Buffer.fromを利用
+ var clientCredentials = Buffer.from(auth.slice('basic '.length), 'base64').toString().split(':');
protectedResource.jsを実行すると、nosqlライブラリにてエラーが発生します。
そこでnosqlライブラリのバージョンを最新の6.1.0にアップします。
そしてコードを以下のように修正することで動作するようになります。
※コードは著作者様のリポジトリへのissueを参考にしました。
$ npm list --depth=0
・・・
+-- nosql@3.2.0
$ npm info nosql versions
[・・・
'5.0.0', '5.0.1-1', '5.0.1', '5.0.2',
'5.0.3', '6.1.0'
]
$ npm install nosql@6.1.0
$ npm audit fix
$ npm audit fix --force
$ npm audit
found 0 vulnerabilities
{
"dependencies": {
"body-parser": "^1.13.2",
"consolidate": "^0.13.1",
"cors": "^2.7.1",
"express": "^4.13.1",
"nosql": "^6.1.0",
"npm": "^6.14.8",
"qs": "^6.9.4",
"randomstring": "^1.0.7",
"sync-request": "^2.0.1",
"underscore": "^1.8.3",
"underscore.string": "^3.1.1"
}
}
- nosql.one(
- function (token) {
- if (token.access_token == inToken) {
- return token;
- }
- }, function(err, token) {
- if (token) {
- console.log("We found a matching token: %s", inToken);
- } else {
- console.log('No matching token was found.');
- }
- req.access_token = token;
- next();
- return;
- },function(err){
- console.log(err);
- });
+ nosql.one().make(function (builder) {
+ builder.where('access_token', inToken);
+ builder.callback(function (err, response) {
+ if (response) {
+ console.log("We found a matching token: %s", inToken);
+ } else {
+ console.log('No matching token was found.');
+ };
+ req.access_token = response;
+ next();
+ return;
+ })
+ });
最後に
ch-3-ex-2以降のサンプルコードについては適宜修正してアップロードしていきたいと思っています。