OAuth2.0プロバイダーを作る! OAuth2.0をより理解するために、認可サービスを作成します。
たぶん実際よりももっと簡単なものになるので、このサービスをOhAuth0.1
と呼ぶことにする。
- 各サーバを起動
make start
- クライアントアプリケーションを起動
make cli
make cli
で help
+ Enter
- サイト(Q&Aサイト)に移動
switch-site 500
- ログイン
login
- ブラウザを立ち上げる
http://localhost:3000/v1/auth?clinet_id=500
- ID: 1, PASSWORD: password を入力する。
- 認可をOKする。
- プロフィールを参照する
view-profile
- 別のサイト(オフィスアプリサービス)に移動
switch-site 501
- プロフィールが確認できないことを確認する
view-profile
サービスクライアントを使用例イメージ。
- 認可した
500
でのみプロフィールを閲覧
- 認証画面
- 認可画面
基本的にGo、WebはNext.jsを利用。
message UserProfile {
string id = 1;
string password = 2;
string name = 3;
uint32 age = 4;
string profile = 5;
}
message ServiceClient {
string id = 1;
string secret = 2;
string name = 3;
string redirect_uri = 4;
string scope = 5;
}
message AuthorizationCode {
string code = 1;
string user_id = 2;
string service_client_id = 3;
google.protobuf.Timestamp expires = 4;
string scope = 5;
}
message AccessToken {
string token = 1;
string user_id = 2;
string service_client_id = 3;
google.protobuf.Timestamp expires = 4;
string scope = 5;
}
message RefreshToken {
string token = 1;
string user_id = 2;
string service_client_id = 3;
google.protobuf.Timestamp expires = 4;
string scope = 5;
}
map[string]*apiv1.UserProfile{
"1": {
Id: "1",
Password: "password",
Name: "Taro",
Age: 20,
Profile: "Hello🎈",
},
"2": {
Id: "2",
Password: "password",
Name: "Hanako",
Age: 20,
Profile: "Hello🌸",
},
}
map[string]*apiv1.ServiceClient{
"500": {
Id: "500",
Name: "Professional Q&A",
Secret: "secret",
RedirectUri: "http://localhost:7777",
Scope: "profile:view",
},
"501": {
Id: "501",,
Name: "Complete Offece",
Secret: "secret",
RedirectUri: "http://localhost:7777",
Scope: "profile:view",
},
}
認証・認可用サーバー。ログイン情報を受け取り、認可コードやトークンを発行する。
認証・認可情報を保存するデータベースサーバー。またユーザのプロフィール情報を保存している。 今回は、認証認可サーバーからのアクセスと、リソースサーバからのトークンの検証を受け付ける。
オンメモリで永続化は非対応。 ログイン情報・サービスクライアント情報はハードコード。
リソースサーバー。トークンを受け取り検証してユーザのリソースを返す。 検証は、データベースサーバーを直接参照する。
今回は、プロフィール情報の閲覧のみに対応している。
認可サービスを利用するサービスクライアント。 一連の認証・認可の流れをCLIで動作させる。
認証・認可のUI。IDとパスワード、認可の確認画面を持つ。
データベースサーバーの通信用。コード自動生成。
make start
のときの各サーバーのログ。