viron/lib
Vironサーバーを構築する上で必要な機能群をまとめたライブラリ。 特定のフレームワークに依存しない関数群のみを提供している。 JavaScript(TypeScrpit)およびGolangをサポート。 サンプルはTypescriptで記述。
-
OpenAPI Specification(oas)
ファイルのロードや$refの解決など、oasを扱う上で有用な機能を提供する。
- ロード
- yaml または json ファイルをロードし、オブジェクトを生成する
- $ref は同時に解決される
- yaml または json ファイルをロードし、オブジェクトを生成する
const { domainsOas } from '@viron/lib';
const path = '/path/to/spec.yaml';
const apiDefinition = await domainsOas.loadResolvedOas(path); - ロード
-
ユーザーに最適化したoasを取得
- エンドポイントへのリクエストはこの関数で生成したoasを返却する
- 引数
infoExtentions
で.info
を上書き可能 ex.) 環境間でテーマやタグを変える - 引数
roleIds
で、操作可能なオペレーションに絞り込んだoasを生成
const { domainsOas } from '@viron/lib';
const infoExtentions = {
'x-theme': 'red',
'x-tags': ['example', 'production']
};
const roleIds = ['viewer'];
const optimizedApiDefinition = await doaminsOas.get(apiDefinition, infoExtentions, roleIds);
res.json(optimizedApiDefinition); -
参照($ref)解決
- OpenAPIオブジェクトの$refを解決する
const { domainsOas } from '@viron/lib';
const apiDefinition = {
components: {
schemas: {
Foo: {
type: object,
properties: {
bar: {
$ref: '#/components/schemas/Bar'
}
}
},
Bar: {
type: string
}
}
}
};
const resolvedSchema = await domainsOas.dereference(apiDefinition); -
@viron/libが提供する機能のoasのパスを取得
const { domainsOas } from '@viron/lib';
const path = domainsOas.getPath('adminusers'); -
複数のoasをマージ
const { domainsOas } from '@viron/lib';
const merged = domainsOas.merge(oas1, oas2,,,); -
Authentication
パスワード認証およびGoogleOAuth2を利用した認証に必要な機能を提供している。
-
config
- JWT
{
secret: 'XXXXXX', // ハッシュ化に用いる秘密鍵
provider: 'example', // JWTの発行者
expirationSec: 24 * 60 * 60 // 有効期間(秒)
}- Google OAuth2
{
clientId: 'XXXX', // OAuth2.0 クライアントID
clientSecret: 'XXXXXXXX', // クライアントシークレット
additionalScopes: [], // https://www.googleapis.com/auth/userinfo.email 以外のスコープをリクエストする場合に指定する
userHostedDomains: ['example.com'], // 利用可能なメールドメイン
}
-
-
JWTインスタンスの初期化
- サーバー起動時に1度実行すればOK
import { domainsAuth } from '@viron/lib'
// 初期化
domainsAuth.initJwt(configJwt); -
サインイン
-
パスワード認証
const token = await domainsAuth.signinEmail(email, password);
// `token` を set-cookie ヘッダにセットしてレスポンスする -
Google OAuth2
/** redirect to google authorization url */
const state = domainsAuth.genState();
const authorizationUrl = domainsAuth.getGoogleOAuth2AuthorizationUrl(
redirectUri,
state,
configGoogle
);
// `state` を set-cookie ヘッダにセットし、`authorizationUrl` へリダイレクトする
/** callback from google */
const { code, state, redirectUri } = req.body;
const cookieState = req.cookies[COOKIE_KEY.OAUTH2_STATE];
if (state !== cookieState) {
throw new Error('illegal request');
}
const token = await domains.signinGoogleOAuth2(
code,
redirectUri,
configGoogle
);
// `token` を set-cookie ヘッダにセットしてレスポンスする
-
-
JWTおよびアクセストークンの検証
- OpenAPIでsecurityを定義しているすべてのオペレーションで実施する
import { domainsAuth } from '@viron/lib'
// JWTの検証
const token = req.cookies[COOKIE_KEY.VIRON_AUTHORIZATION];
const claims = await domainsAuth.verifyJwt(token); // claimsが取得できればOK
// Google認証の場合はアクセストークンも検証する
const valid = await domainsAuth.verifyGoogleOAuth2AccessToken(
claims.sub,
{
googleOAuth2AccessToken: '';
googleOAuth2ExpiryDate: 1234567890;
googleOAuth2IdToken: '';
googleOAuth2RefreshToken: '';
googleOAuth2TokenType: '';
},
configGoogle
); -
サインアウト
const token = req.cookies[COOKIE_KEY.VIRON_AUTHORIZATION];
await domainsAuth.signout(token);
// cookieから `COOKIE_KEY.VIRON_AUTHORIZATION` をクリアする -
AuthConfig
サーバがサポートしている認証方式をブラウザに伝えるための設定。
- エンドポイントのレスポンスヘッダに
x-viron-authtypes-path
ヘッダを返す- エンドポイントが認証エラーを返す場合もセットする必要があるため注意が必要
res.set(HTTP_HEADER.X_VIRON_AUTHTYPES_PATH, VIRON_AUTHCONFIGS_PATH);
- エンドポイントのレスポンスヘッダに
-
VIRON_AUTHCONFIGS_PATH
へのGETリクエストで、認証方式を返す- Google認証を使いたくない場合などは このレスポンスにGoogle関連の情報を返さないようにする
import { domainsAuthConfigs } from '@viron/lib'
const authConfigs = domainsAuthConfigs.genAuthConfigs(
[
{
provider: 'viron',
type: 'email',
method: 'post',
path: '/email/signin',
},
{
provider: 'google',
type: 'oauth',
method: 'get',
path: '/oauth2/google/authorization'
},
{
provider: 'google',
type: 'oauthcallback',
method: 'post',
path: '/oauth2/google/callback'
},
{
provider: 'signout',
type: 'signout',
method: 'post',
path: '/signout'
}
],
apiDefinitions // oas
);
res.json(authConfigs);