openstack4j를 활용해 keystone 인증은
http://www.openstack4j.com/learn/getting-started
openstack4j의 keystone 인증 방식(v2.0) 관련 예제는 다음과 같다.
import org.openstack4j.api.OSClient.{OSClientV2, OSClientV3}
import org.openstack4j.core.transport.Config
import org.openstack4j.model.common.Identifier
import org.openstack4j.openstack.OSFactory
val os: OSClientV2 = OSFactory.builderV2()
.endpoint("https://internal.k8s.openstack.google.io:5000/v2.0")
.credentials("sam","password")
.tenantName("admin")
.authenticate()
println(os.getAccess.getToken)
결과
KeystoneToken{id=3a735957bd0c45d3b64242e0edd150cb, created=Wed Feb 07 20:51:37 KST 2018, expires=Thu Feb 08 11:51:37 KST 2018, tenant=KeystoneTenant{id=ae17dbd7165142808e074579360a8b9c, name=admin, description=NULL, enabled=true}}
sing Identity V3 authentication you basically have 4 options:
(1) authenticate with project-scope
OSClientV3 os = OSFactory.builderV3()
.endpoint("http://<fqdn>:5000/v3")
.credentials("admin", "secret", Identifier.byId("user domain id"))
.scopeToProject(Identifier.byId("project id"))
.authenticate());
(2) authenticate with domain-scope
OSClientV3 os = OSFactory.builderV3()
.endpoint("http://<fqdn>:5000/v3")
.credentials("admin", "secret", Identifier.byId("user domain id"))
.scopeToDomain(Identifier.byId("domain id"))
.authenticate());
(3) authenticate unscoped
OSClientV3 os = OSFactory.builderV3()
.endpoint("http://<fqdn>:5000/v3")
.credentials("user id", "secret")
.authenticate();
(4) authenticate with a token
OSClientV3 os = OSFactory.builderV3()
.endpoint("http://<fqdn>:5000/v3")
.token("token id")
.scopeToProject(Identifier.byId("project id"))
.authenticate());
실제로 아래와 같이 테스트해보면 안되기도 한다.
val domainid = Identifier.byName("Default")
val os: OSClientV3 = OSFactory.builderV3()
.endpoint("https://internal.k8s.openstack.google.io:5000/v3")
.credentials("sam","password",domainid)
.scopeToDomain(domainid)
.authenticate()
OSFactory.enableHttpLoggingFilter(true)
println(os.getToken)
인증만 할꺼라 json으로 파싱해서 보내는것이 나은 듯 하다.. ㄷ ㄷ
예제의 도메인을 그대로 참조해서
https://internal.k8s.openstack.google.io:5000/v3/auth/tokens 엔드 포인트에 다음 json을 body로 보낸다.
import play.api.libs.json._
val json: JsValue = Json.parse(s"""
{
"auth" : {
"identity": {
"methods": [ "password" ],
"password": {
"user": {
"name": "${userId}",
"domain": { "name" : "Default" },
"password": "${password}"
}
}
}
}
}
"""
)
post 결과는 다음과 같다.
{
"token":{
"issued_at":"2018-02-07T20:42:58.000000Z",
"audit_ids":[
"111123132"
],
"methods":[
"password"
],
"expires_at":"2018-02-08T20:42:58.000000Z",
"user":{
"domain":{
"id":"default",
"name":"Default"
},
"id":"1a1a1aasfdadf",
"name":"sam"
}
}
}