ืืคื ื ืืกืคืจ ืืืืฉืื, ืืืืขืชื ืฉืจืช OpenID Connect ืื ืืืื ืืืฉื ืืืืืช ืืืืืฉืืืื ืืคื ืืืืื ืฉืื ื. ืืืคืืชืืืื ืฉืื ื, ื ืืืื ืืงื ื ืืืื ืงืื ืืืชืจ, ืขืืจื ื ืืกืื ืืจื ืืงืืื. ืืืฉื ืืจื ืืฉืืจืืช ืืืจืืื ืืคืฉืืช ืืืื ืคืขืืืืช ืืื ืืืื ืืืช, ืืคืืืชื ืืช ืขืืืช ืืืืขืช ืืจืฉืืืช, ืืืคืฉืจืช ืืืฆืื ืคืชืจืื ืืช ืืืื ืื ืจืืื ืืื ืืขืฆืื ืืช ืืืื ืืขืช ืคืืชืื ืคืชืจืื ืืช ืืืฉืื. ืืืืืจ ืื ืืืืจ ืขื ืืืขืืจ ืืื ืืขื ืืืืืืจืืช ืฉืืฆืืื ื ืืืื.
ืืืื... ืืื ืืื ืืชืืื
ืืคื ื ืืกืคืจ ืฉื ืื, ืืฉืืื ืืืชืจ ืืื ืืคืืืงืฆืืืช ืคื ืืืืืช ืืฉืืืื ืืื ืืช, ืืชืื ื ืืคืืืงืฆืื ืืฉืืืื ืืืืฉื ืืชืื ืืืืจื. ืื ืืืืชื ืืคืืืงืฆืืืช Rails ืคืฉืืื ืฉืืชืืืจื ืืืกื ื ืชืื ืื ืขื ืืืืข ืขื ืขืืืืื, ืฉืื ืืืืืจื ืืืฉื ืืคืื ืงืฆืืื ืืืืช ืฉืื ืืช. ืืืงืืื ืืขืืื ื ืืช ื-SSO ืืจืืฉืื ืฉืืชืืกืก ืขื ืืืืืช ืืืงื ืื ืืืฆื ืฉื ืืืงืื ืืฉืจืช ืืืจืฉืืืช, ืืืืงื ืืืขืืจ ืืฆืืจื ืืืฆืคื ืช ืขื ืืกืคืจ ืคืจืืืจืื ืืืืืช ืืฉืจืช ืืืจืฉืืืช. ืื ืื ืืืืชื ืืืคืฉืจืืช ืื ืืื ืืืืชืจ, ืฉืื ืื ืืคืืืงืฆืื ืคื ืืืืช ืืืืชื ืฆืจืืื ืืชืืจ ืฉืืื ืื ืืืืืืช ืฉื ืืืืืื, ืืืกืื ืื ืชืื ืื ืฉื ืืขืืืืื ืืื ืืกืื ืืจื ืื ืืืืืืื ืขื ืฉืจืช ืืืจืฉืืืช.
ืืืืจ ืืื ืื, ืืืืื ื ืืคืฉื ืืช ืืฉืืืช ืืืจืฉืื ืืจืืืืืืช. SSO ืืืขืืจ ืืืืื. ืืขืืจืช OpenResty ื ืืกืคื ืชืื ืืช ื-Lua ืฉืืืงื ืืกืืืื ืื, ืืืืขืช ืืืืื ืืคืืืงืฆืื ืืคื ืืื ืืืงืฉื ืืืืืื ืืืืืง ืื ืืฉ ืฉื ืืืฉื. ืืืฉื ืื ืคืฉืื ืืืื ืืช ืืฉืืืช ืืฉืืืื ืืืืฉื ืืืืฉืืืื ืคื ืืืืื โ ืืงืื ืฉื ืื ืืคืืืงืฆืื ืื ืืื ืฆืืจื ืขืื ืืชืืจ ืืืืืื ื ืืกืฃ. ืืชืืฆืื ืืื, ืกืืจื ื ืืช ืืชืขืืืจื ืืืฆืื ืืช, ืืืืคืืืงืฆืื ืขืฆืื ืื ืืืขื ืืืจ ืขื ืืจืฉืื.
ืขื ืืืช, ืืขืื ืืืช ื ืืชืจื ืืืชื ืคืชืืจื. ืื ืืืื ืืคืืืงืฆืืืช ืฉืฆืจืืืืช ืืืืข ืขื ืขืืืืื? ืืคืฉืจ ืืื ืืืชืื API ืขืืืจ ืฉืืจืืช ืืืจืฉืืืช, ืืื ืื ืชืฆืืจื ืืืืกืืฃ ืืืืืื ื ืืกืฃ ืขืืืจ ืื ืืืฉืื ืืื. ืื ืืกืฃ, ืจืฆืื ื ืืืืคืืจ ืืืชืืืช ืืืืช ืืืืคืืืงืฆืืืช ืฉื ืืชืื ืืขืฆืื ื, ืฉืืืืื ืืชืืจืืื ื-OpenSource, ืืฉืจืช ืืืจืฉืืืช ืืคื ืืื ืฉืื ื. ื ืืืจ ืขื ืื ืืคืขื ืืืจืช. ืืคืชืจืื ืืฉืชื ืืืขืืืช ืืื OAuth.
ืืกืื ืืจืืื ืืฉืืชืคืื
OAuth ืืื ืชืงื ืืจืฉืืืช ืืืื ืืืงืืื, ืื ืืืืืื ืฉืจืง ืืคืื ืงืฆืืื ืืืืช ืฉืื ืืื ื ืืกืคืืงื, ืื ืืื ืืืื ืืฉืงืื ืืช OpenID Connect (OIDC). OIDC ืขืฆืื ืืื ืืืืืขื ืืฉืืืฉืืช ืฉื ืชืงื ืืืืืืช ืืคืชืื, ืืฉืจ ืืจื ืืชืืกืฃ ืขื ืคืจืืืืงืื OAuth 2.0 (ืคืจืืืืงืื ืืจืฉืืืช ืคืชืื). ืคืชืจืื ืื ืกืืืจ ืืช ืืขืืืช ืืืืกืืจ ืื ืชืื ืื ืขื ืืฉืชืืฉ ืืงืฆื, ืืืืคืฉืจ ืื ืืืืืืฃ ืืช ืกืคืง ืืืจืฉืื.
ืขื ืืืช, ืื ืืืจื ื ืกืคืง ืกืคืฆืืคื ืืืืืื ื ืืืืกืืฃ ืืื ืืืจืฆืื ืขื OIDC ืขืืืจ ืฉืจืช ืืืจืฉืืืช ืืงืืื ืฉืื ื. ืืืืืช ืืืืื ืื ืืืืชื ืืขืืืื ืฉ-OIDC ืืืืฉื ืืืื ืืืืื ืช ืืจืฉืืืช ืืฉืชืืฉ ืงืฆื. ืืคืืื, ื ืืชื ืืื ืืืืฉื ืชืืืืช OIDC ืืฉืจืช ืืืจืฉืืืช ืื ืืืื ืฉืื.
ืืืจื ืฉืื ื ืืืืฉื ืฉืจืช OIDC ืืฉืื ื
1) ืืืื ืืช ืื ืชืื ืื ืืืืคืก ืืจืฆืื
ืืื ืืฉืื ืืช OIDC, ืืฉ ืฆืืจื ืืืืื ืืช ื ืชืื ื ืืืฉืชืืฉ ืื ืืืืืื ืืฆืืจื ืืืื ืช ืืคื ืืชืงื. ื-OIDC ืื ื ืงืจื ืชืืืขืืช. ืชืืืขืืช ืื ืืขืฆื ืฉืืืช ืืืจืื ืื ืืืกื ืื ืชืื ืื ืฉื ืืืฉืชืืฉ (ืฉื, ืืืืจ ืืืงืืจืื ื, ืืืคืื ืืื'). ืงืืื
ืงืืืฆืช ืกืืื ื ืืืืืจ ืืฉืืืืช ืืงืืืฆืช ืืืฉื ื ืืืื - ืืืงืฃ. ืืืืื ืืืจืฉืื ืืชืืงืฉืช ืืืฉื ืื ืืืืชืืื ืกืคืฆืืคืืื, ืืื ืืืืงืคืื, ืื ืื ืืื ืฆืืจื ืืืืง ืืืืืชืืื ืืืกืงืืค.
2) ืืืฉื ืืช ืืืขื ืงืื ืืืจืืฉืื
ืืืืง ืืื ืฉื ืฉืืืื OIDC ืืื ืืืืืจื ืืืืืฉืื ืฉื ืกืืื ืืจืฉืืืช, ืื ืฉื ืงืจื ืืขื ืงืื. ืืชืจืืืฉ ืื ืืกืฃ ืฉื ืืื ืืจืืงืฆืื ืืื ืืืคืืืงืฆืื ืฉื ืืืจื ืืฉืจืช ืืืจืฉืื ืืืื ืชืืื ืืืขื ืงื ืฉื ืืืจื. ืชืื ืืช ืืืืืื ืืืืืจืช ืืืขื ืง ืื ืืื ืืืฆืืช ืืืืืจ ืฉืืืื.
ืขืืืจ ืืืงืฉื ืืจืืฉืื ื ืฉืื ื, ืืฉืชืืฉื ื ืืืขื ืง ืื ืคืืฅ ืืืืชืจ, ืงืื ืืืจืฉืื. ืืืืื ืฉืื ืืืืจืื ืืื ืฉืืื ืฉืืืฉื ืฉืืืื, ืืืืืจ. ืขืืืจ ืืืืงืืช ื ืืกืคืืช. ืจืืฉืืช, ืืืฉืชืืฉ ืืืืฉ ืืงืฉื ืืืืฉืืจ ืืืฉืืจ, ืืงืื ืืกืืืื - ืงืื ืืจืฉืื, ืืื ืขื ืืืกืืืื ืืื, ืืืืื ืขื ืืจืืืก ืื ืกืืขื, ืืืงืฉ ืืกืืืื ืืืฉื. ืื ืืืื ืืจืืงืฆืื ืืขืืงืจืืช ืฉื ืกืงืจืืคื ืืืจืฉืื ืืื ืืืืกืกืช ืขื ืืคื ืืืช ืืืืฉ ืืื ืืืคืืืงืฆืื ืืฉืจืช ืืืจืฉืืืช. ืชืืื ืืงืจืื ืขืื ืขื ืืขื ืง ืื
OAuth ืืืงื ืืชืคืืกื ืืคืื ืืกืืืื ื ืืืืฉื ืืืชืงืืืื ืืืืจ ืืืจืฉืื ืฆืจืืืื ืืืืืช ืืื ืืื ืืจืฆืื ืืืฉืชื ืืช ืื 10 ืืงืืช ืืืืืฆืข. ืืขื ืงืช ืงืื ืืืจืฉืื ืืื ืืืืืช ืื ืฉืืืฉื ืฉืืืื ืืืืฆืขืืช ืืคื ืืืช ืืืืฉ, ืื 10 ืืงืืช ืืืคืื ืฆืขื ืืื, ืืืขื ืืืืช, ืืื ืื ืืืฉืืื ืืื ื ืขืืื ืืขืื ืืื. ืืื ืืคืชืืจ ืืขืื ืื ืืฉ ืืขื ืง ื ืืกืฃ - Refresh Token, ืฉืื ืื ืืฉืชืืฉื ื ืืืจืฆื ื. ืืื ืืืชืจ ืงื ืืื. ืืืืื ืืืืืช ืืืขื ืง ืืืจ, ืื ืืกืฃ ืืืกืืืื ืืืืฉื ืืจืืฉื, ืืื ืคืง ืขืื ืืื - Refresh Token, ืฉื ืืชื ืืืฉืชืืฉ ืื ืจืง ืคืขื ืืืช ืืืืจื ืืืื ืืจืื ืืจืื ืืืจืื. ืขื Refresh Token ืื, ืืืฉืจ ื-TTL (Time to Live) ืฉื ืืกืืืื ืืืืฉื ืืจืืฉื ืืกืชืืื, ืืืงืฉื ืืืกืืืื ืืืฉื ืืืฉ ืชืืืข ืื ืงืืืช ืืงืฆื ืฉื ืืขื ืง ื ืืกืฃ. ื-Refresh Token ืืฉืืืืฉ ืืืืคืก ืืื ืืืคืก. ืืืืงื ืื ืืื ืื-ืฉืืืืช ืื ืืชื ืืืฆืข ืืืชื ืืจืงืข, ืืืืคื ืืืชื ืืืจืืฉ ืืืฉืชืืฉ.
3) ืืืืจ ืคืืจืืืื ืืืชืืืื ืืืฉืืช ืฉื ืคืื ื ืชืื ืื
ืืืืจ ืืืฉืื ืืืขื ืงืื ืฉื ืืืจื, ืืืจืฉืื ืขืืืืช, ืจืืื ืืืืืืจ ืงืืืช ื ืชืื ืื ืขื ืืฉืชืืฉ ืืงืฆื. ื- OIDC ืืฉ ื ืงืืืช ืงืฆื ื ืคืจืืช ืขืืืจ ืื, ืฉืื ืืชื ืืืื ืืืงืฉ ื ืชืื ื ืืฉืชืืฉ ืขื ืืกืืืื ืืืืฉื ืื ืืืื ืฉืื ืืื ืืื ืืขืืืื. ืืื ืื ืชืื ืื ืฉื ืืืฉืชืืฉ ืื ืืฉืชื ืื ืืขืชืื ืงืจืืืืช ืื ืื, ืืืชื ืฆืจืื ืืขืงืื ืืืจ ืืื ืื ืืืืืื ืคืขืืื ืจืืืช, ืืชื ืืืื ืืืืืข ืืคืชืจืื ืืื JWT tokens. ืืกืืืื ืื ืืื ื ืชืืืื ืื ืขื ืืื ืืชืงื. ืืกืืืื JWT ืขืฆืื ืืืจืื ืืฉืืืฉื ืืืงืื: ืืืชืจืช (ืืืืข ืขื ืืืกืืืื), ืืืขื (ืื ืื ืชืื ืื ืืืจืืฉืื) ืืืชืืื (ืืชืืื, ืืืกืืืื ืืชืื ืขื ืืื ืืฉืจืช ืืชืืืื ืืืืืง ืืืืืจ ืืืชืจ ืืช ืืงืืจ ืืืชืืื ืฉืื).
ืืืืฉืื OIDC, ืืกืืืื JWT ื ืงืจื id_token. ื ืืชื ืืืงืฉ ืืืชื ืืื ืขื ืืกืืืื ืืืฉื ืจืืื ืืื ืื ืฉื ืืชืจ ืืื ืืืืช ืืช ืืืชืืื. ืืฉืจืช ืืืจืฉืื ืืฉ ื ืงืืืช ืงืฆื ื ืคืจืืช ืขืืืจ ืื ืขื ืืืืจื ืฉื ืืคืชืืืช ืฆืืืืจืืื ืืคืืจืื
ืืืฉื ืืืืื:
{
"issuer": "https://accounts.google.com",
"authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
"device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
"token_endpoint": "https://oauth2.googleapis.com/token",
"userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
"revocation_endpoint": "https://oauth2.googleapis.com/revoke",
"jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
"response_types_supported": [
"code",
"token",
"id_token",
"code token",
"code id_token",
"token id_token",
"code token id_token",
"none"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"scopes_supported": [
"openid",
"email",
"profile"
],
"token_endpoint_auth_methods_supported": [
"client_secret_post",
"client_secret_basic"
],
"claims_supported": [
"aud",
"email",
"email_verified",
"exp",
"family_name",
"given_name",
"iat",
"iss",
"locale",
"name",
"picture",
"sub"
],
"code_challenge_methods_supported": [
"plain",
"S256"
],
"grant_types_supported": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:device_code",
"urn:ietf:params:oauth:grant-type:jwt-bearer"
]
}
ืื, ืืืืฆืขืืช id_token, ืืชื ืืืื ืืืขืืืจ ืืช ืื ืกืืื ื ืืืืืจ ืืืจืืฉืื ืืืืขื ืฉื ืืืกืืืื ืืื ืืืฆืืจ ืงืฉืจ ืขื ืฉืจืช ืืืจืฉืื ืืื ืคืขื ืืื ืืืงืฉ ื ืชืื ื ืืฉืชืืฉ. ืืืืกืจืื ืืืืฉื ืื ืืื ืฉืืฉืื ืื ืื ืชืื ื ืืืฉืชืืฉ ืืืฉืจืช ืื ืืืืข ืืื, ืืื ืืื ืขื ืืกืืืื ืืืฉื ืืืฉ.
ืชืืฆืืืช ืืืฉืื
ืื, ืืืืจ ืืืืขืช ืฉืจืช OIDC ืืฉืื ื ืืืืืจืช ืืืืืจืื ืืืื ืืฆื ืืืคืืืงืฆืื, ืคืชืจื ื ืืช ืืืขืื ืฉื ืืขืืจืช ืืืืข ืขื ืืฉืชืืฉืื.
ืืืืืื ืฉ-OIDC ืืื ืชืงื ืคืชืื, ืืฉ ืื ื ืืคืฉืจืืช ืืืืืจ ืกืคืง ืงืืื ืื ืืืฉืื ืฉืจืช. ื ืืกืื ื ืืช Keycloak, ืฉืืชืืจืจ ืื ืื ืืืื ืืืืืจื, ืืืืจ ืืืืจื ืืฉืื ืื ืชืฆืืจืืช ืืืืืจ ืืฆื ืืืคืืืงืฆืื, ืืื ืืืื ืืืคืขืื. ืืฆื ืืืคืืืงืฆืื, ืื ืื ืฉื ืืชืจ ืืื ืืฉื ืืช ืืช ืชืฆืืจืืช ืืืืืืจ.
ืืืืจืื ืขื ืคืชืจืื ืืช ืงืืืืื
ืืชืื ืืืจืืื ืฉืื ื, ืืฉืจืช ื-OIDC ืืจืืฉืื, ืืจืืื ื ืืืฉืื ืืฉืื ื, ืฉื ืืกืคื ืืคื ืืฆืืจื. ืืืืจ ืกืงืืจื ืืคืืจืืช ืฉื ืคืชืจืื ืืช ืืืื ืื ืืืจืื, ืื ื ืืืืืื ืืืืจ ืฉืืืื ื ืงืืื ืฉื ืืื ืืืืืืงืช. ืืืืืช ืืืืืื ืืืืืืข ืฉืจืช ืืฉืืื, ืืื ืืฉืฉืืช ืืฆื ืืกืคืงืื ืืืืขืืจ ืืคืื ืงืฆืืื ืืืืช ืืืจืืฉื, ืืื ืื ื ืืืืืช ืฉื ืืขืจืืช ืืฉื ื ืฉืื ืืื ืืจืฉืืืช ืืืชืืืืช ืืืฉืืช ืฉืื ืืช ืืืื ืฉืืจืืชืื ืืื ืืจืื ืฉื ื ืชืื ืื ืขื ืขืืืืื ืืืจ ืืืืกื ื. ืขื ืืืช, ืืืืฉืืืื ืืืื ืื, ืืฉื ื ื ืืืืช ืืืื ืืืจืฆืื. ืืืืืื, ื-Keycloak ืืขืจืืช ื ืืืื ืืฉืชืืฉืื ืืฉืื ืืื ืชืื ืื ืืืืืกื ืื ืื ืืฉืืจืืช, ืืื ืืืื ืงืฉื ืืขืงืืฃ ืฉื ืืช ืืืฉืชืืฉืื ืฉืืื. ืืฉื ืื, ื- Keycloak ืืฉ API ืฉืืืคืฉืจ ืืื ืืืฆืข ืืืืคื ืืื ืืช ืื ืคืขืืืืช ืืืขืืจื ืืืจืืฉืืช.
ืืืืื ื ืืกืคืช ืืืืืืฉ ืืืกืื, ืืขื ืืื, ืืืขืชื, ืืื ืืืจื ืืืืจื. ืื ืืขื ืืื ืื ืื ืืืจืื ืืืจืืืืื ืฉืื ืื. ืืื ืืืฉืชืื, ืชืฆืืจื ืืงืฉืจ ืืช ืฉืืจืืช ื ืืืื ืืืฉืชืืฉืื ืฉืื ืืฉืืจืืช ืืืจืฉืืืช ืฉืืื ืืืืจืืื ืืคื ืืฆืืจื.
Keycloak ืืืืจื ืืืืจื ืื ืื ืคืชืจืื ืืช ืืืืฃ ืืืืืืื. ืขืืืฃ ืืืืืจ ืืืฉืื ืืืืฉืจ ืขื ืืื ืงืจื OpenID. ืืคืชืจืื ืืช ืืื ืืฉ ืืืจื ืืื ืชื ืืืฉืืจ OpenID.
ืื ืชืฉืื ืื ืืกืคืงืื ืืชืฉืืื ืงืืืืื ืื ืืื ื ืจืืฆื ืืฉืืืจ ืขื ืฉืจืช ื-OIDC ืฉืื. ืืืื ืืฉ ืืจืื ืืคืฉืจืืืืช ืืืืืช.
ืื ืืืื
ืืขืชืื ืืงืจืื, ืื ืื ื ืืืืืื ืืกืืืจ ืืช ืืชื ืืขื ืืฉืืจืืชืื ืคื ืืืืื ืืืจื ืืืจืช. ืื ื ืืชืื ื ืื ืืืขืืืจ ืืช ื-SSO ืื ืืืื ืฉืื ื ืืืืื ืืืืฆืขืืช OpenResty ื-proxy ืืืืืกืก ืขื OAuth. ืืฉ ืืื ืืืจ ืืจืื ืคืชืจืื ืืช ืืืื ืื, ืืืฉื:
ืืืืจืื ื ืืกืคืื
ืืงืืจ: www.habr.com