他カテゴリ

【ALIS】OAuth認証の基本的な手順

ゆうき's icon'
  • ゆうき
  • 2019/06/17 02:53
Content image

 

リンク:

アリスブログOAuth認証の説明まとめ > 当記事

 

◆ 【ALIS】OAuth認証の基本的な手順

OAuthの公式ドキュメント」では、一体どのような流れで認証を済ませているのかを説明してみました。

 

○ 留意事項

・公式ドキュメントでは「Node.js」を利用しているため、そちらに沿って説明していきます

・筆者の「ゆうき」は「へっぽこハッカー」です。サーバーサイドの知識は全然ないので、説明に間違いがあるかもしれません。予めご了承下さい

・下記の説明に誤りがあったら、コメントで指摘しておいてもらえると助かります

 

 

○ 基本的な流れ

1,ALISのOAuth認証の利用ガイドラインを確認

2,「Node.js」等が動かせるサーバーを用意

3,ALISの「登録中のアプリケーションの項」からアプリケーションを登録する

4,許可コードを生成する

5,セッションやクッキーなどで「code_verifier」という変数を保存

6,コールバック用のページを用意

7,アクセストークンを取得する

8,アクセストークンを使って、APIを叩く

 

 

○ サンプルソース

 

 

○ 補足など

1,ALISのOAuth認証の利用ガイドラインを確認

省略。

 

 

2,「Node.js」等が動かせるサーバーを用意

あたり前のことなので、公式ドキュメントでは説明が省略されてしまっていますが、サーバーサイドプログラムの「Node.js」を動かすためには、サーバーが必要です

 

レンタルサーバーで動かしたい場合は、「Node.js」が使えることを確認した上でインストール。

※ 日本の安すぎるレンタルサーバーだと、「Node.js」をインストールすることができる権利……というか「ssh認証」の権利(Linuxコマンドによる操作の権利)がなかったりすることもあるので注意

 

VPSなら(おそらく)普通に導入可能、なはず。

上記のサンプルコードでは、無料のサーバーレスシステムの「ZEIT Now」を利用しています。

 

 

3,ALISの「登録中のアプリケーションの項」からアプリケーションを登録する

プログラムを作る際、「Client ID」「Client Secret(重要。他者に漏洩したら終わるもの)」は第三者にはわからないようにしておきましょう

間違っても、JavaScriptをユーザーサイドで起動して(Html文に入れて)「Client ID」「Client Secret」の変数が露呈することはないように。

 

また、リダイレクトURIは、サイトのトップページとかではなく、コールバックを受け取るページのURLを記載しておけばOKです。

(一例:https://alis-oauth-sample.yuuki.now.sh/api/routes/callback.js)

 

 

4,許可コードを生成する

公式のサンプルでは、「base64url」「sha256」のパッケージを利用しているので、「Node.js」を使用する場合は、こちらも(npm installとかで)インストールしておく必要があります。

(phpで作る場合は、多分上記のような追加パッケージは不要)

 

 

5,セッションやクッキーなどで「code_verifier」という変数を保存

公式ドキュメントには詳しく書かれていなかったと思いますが、「code_verifier」は「4,許可コードを生成する」と「7,アクセストークンを取得する」で同じものを使用しなければならないため

「4,許可コードを生成する」の時点で、何らかの手法で「code_verifier」変数を保持しておく必要があります

 

上記のリンクのコードでは「code_verifier」をクッキーに入れて保存していますが、実用的なサービスの場合は、セッション(サーバー側)で保存しておいたほうが良いかもしれませんね。

 

※1 上記のリンクのサンプルコードは「ZEIT Now」で動かしているため、データベースがないことから、クッキーを利用しています

※2 一応、「ZEIT Now」の場合でも、FireBaseとかMongoDBとかHerokuと連携すれば、セッション管理ができると思われます(やったことはないけど)

※3 上記のリンクのサンプルコードでは、クッキー利用の際に「express」と「cookie-session」のパッケージを使用しています

 

 

6,コールバック用のページを用意

const code = req.query;

のような感じで、

「https://example.com/oauth?code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx」

codeの部分(xxxxxxxxxxxxxxxxxxxxxxxxxxxxx)を回収できるようにしておきます。

 

 

7,アクセストークンを取得する

一例:

const client_id = process.env.CLIENT_ID; 
const client_secret = process.env.CLIENT_SECRET; 
const fetch = require("node-fetch");
const redirect_uri = process.env.REDIRECT_URI; 
const alis_oauth_base_url = "https://alis.to/oauth2";

export const getToken = req => { 
 const { code_verifier } = req.session; 
 const { code } = req.query; 
 const token = Buffer.from(`${client_id}:${client_secret}`).toString("base64"); 
 const options = { 
   body: `grant_type=authorization_code&code=${code}&redirect_uri=${redirect_uri}&code_verifier=${code_verifier}`, 
   method: "POST", 
   headers: { 
     Authorization: `Basic ${token}`, 
     "Content-Type": "application/x-www-form-urlencoded" 
   } 
 }; 
 return fetch(`${alis_oauth_base_url}/token`, options); 
};

公式には、アクセストークン取得のサンプルコードが用意されていなかったので記載。

ここでは「node-fetch」というパッケージを利用しています。

その他はコードを読んで、何となく必要なものを理解して下さい。

 

const { code_verifier } = req.session; 

「req.session」は、前に作ったクッキーの情報の読み込みです。

「4,許可コードを生成する」の時点で、「req.session.code_verifier = code_verifier;」というような感じで、変数を保持しています。

 

補足:ALISの通常のAPIでの個人認証は「id_token」を利用していましたが、「OAuth認証」の場合は「access_token」を利用するみたいです

 

 

8,アクセストークンを使って、APIを叩く

「7,アクセストークンを取得する」で「アクセストークン」さえゲットできてしまえば、後は「Authorization ヘッダ」に「アクセストークン」を追加するだけでやりたい放題です

(注意:アクセストークンの寿命は1時間なので、それ以上使う予定があるなら、「7」の時点でリフレッシュトークンも回収しておきましょう)

 

一例:

export const getMyInfo = access_token => { 
 const options = { 
   method: "GET", 
   headers: { 
     Authorization: `${access_token}`, 
     "Content-Type": "application/json" 
   } 
 }; 
 return fetch(`${alis_api_base_url}/me/info`, options); 
};

 

おまけ:Python(ローカル環境)での、アクセストークンを使った認証の確認

import urllib.request 
import json 
import pprint 

# アクセストークンの入力 
access_token = input('Your Access Token:') 

url_name1 = 'https://alis.to/oauth2api/me/info' 
method1 = 'GET' 
headers1 = {'Authorization': access_token} 

request1 = urllib.request.Request(url_name1, None, headers = headers1 , method = method1) 

with urllib.request.urlopen(request1) as cm_data1: 
   response_data1 = json.loads(cm_data1.read().decode("utf-8")) 

pprint.pprint(response_data1) 

input('Enterキーで終了')

「ALISのAPI」を使用する方法まとめ

で「Python」を利用された方は、こちらのほうが馴染み深い……かも。

(「個人認証のプログラム」の一部を改造しただけです)

 

 

以上です。

サンプルコードと、手順の説明があれば、OAuth認証の他言語化とかも比較的用意になると思います。

(´∀`)

 

 

「OAuth認証の説明まとめ」に戻る

 

 

◆ 「ゆうき」のツイッター

 

 

 

 

Supporter profile iconSupporter profile icon
Article tip 2人がサポートしています
獲得ALIS: Article like 35.16 ALIS Article tip 21.00 ALIS
ゆうき's icon'
  • ゆうき
  • @yuuki

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

Like token Tip token
947.13 ALIS
Eye catch
トラベル

梅雨の京都八瀬・瑠璃光院はしっとり濃い新緑の世界

Like token Tip token
216.64 ALIS
Eye catch
クリプト

NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

Like token Tip token
121.79 ALIS
Eye catch
他カテゴリ

テレビ番組で登録商標が「言えない」のか考察してみる

Like token Tip token
26.20 ALIS
Eye catch
他カテゴリ

警察官が一人で戦ったらどのくらいの強さなの?『柔道編』 【元警察官が本音で回答】

Like token Tip token
114.82 ALIS
Eye catch
トラベル

わら人形を釘で打ち呪う 丑の刻参りは今も存在するのか? 京都最恐の貴船神社奥宮を調べた

Like token Tip token
486.35 ALIS
Eye catch
他カテゴリ

機械学習を体験してみよう!(難易度低)

Like token Tip token
124.82 ALIS
Eye catch
クリプト

Bitcoinの価値の源泉は、PoWによる電気代ではなくて"競争原理"だった。

Like token Tip token
159.32 ALIS
Eye catch
他カテゴリ

警察官が一人で戦ったらどのくらいの強さなの?『柔道編』 【元警察官が本音で回答】

Like token Tip token
114.82 ALIS
Eye catch
他カテゴリ

SASUKEオーディションに出た時の話

Like token Tip token
35.87 ALIS
Eye catch
他カテゴリ

京都のきーひん、神戸のこーへん

Like token Tip token
12.10 ALIS
Eye catch
クリプト

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

Like token Tip token
38.31 ALIS