大口深呼吸,現在要開始把 Ktor 綁上 Keycloak 大船了。
老姐還笑我太緊張,都不知道我這幾天查了多少資料。
官網的範例看起來沒有問題,就是少了些詳細說明,幸好憑經驗多少能補足。 https://ktor.io/docs/authentication-oauth.html
先在 build.gradle
加上相關 Library 。
implementation "io.ktor:ktor-auth:$ktor_version"
implementation "io.ktor:ktor-client-apache:$ktor_version"
implementation "io.ktor:ktor-auth-jwt:$ktor_version"
在 Application.module
裡加上 keycloakOAuth 程式碼。
install(Authentication) {
oauth("keycloakOAuth") {
client = HttpClient(Apache)
providerLookup = { OAuthServerSettings.OAuth2ServerSettings(
name = "keycloak",
authorizeUrl = "$authorizeUrl",
accessTokenUrl = "$accessTokenUrl",
clientId = "$clientId",
clientSecret = "$clientId",
accessTokenRequiresBasicAuth = false,
requestMethod = HttpMethod.Post,
defaultScopes = listOf("roles")
)}
urlProvider = {
redirectUrl("/", false)
}
}
}
轉向網址的程式碼因為可能會多次用到,獨立出來寫成 redirectUrl 函式 。
private fun ApplicationCall.redirectUrl(t: String, secure: Boolean = true): String {
val hostPort = request.host()!! + request.port().let { port -> if (port == 80) "" else ":$port" }
val protocol = when {
secure -> "https"
else -> "http"
}
return "$protocol://$hostPort$t"
}
authorizeUrl
和 accessTokenUrl
可在昨天新增的 realm setting Turtlesoup 點下 Endpoints 的 OpenID Endpoint Configuration
打開網頁拿到。
clientId 可在昨天新增的 Clients soup bowl 裡昨天拿到,但 clientSecret 要把 Access Type 改成 confidential 才能有 Credentials
分頁。
接著設定登入網址,登入後要拿哪些資料晚點再處理。
routing {
authenticate("keycloakOAuth") {
route("/login") { // Redirects for authentication
param("error") {
handle {
call.respond(call.parameters.getAll("error").orEmpty())
}
}
handle {
val principal = call.authentication.principal<OAuthAccessTokenResponse.OAuth2>()
if (principal != null) {
val token = JWT.decode(principal.accessToken)
//todo
} else {
call.respond(HttpStatusCode.Unauthorized)
}
}
}
}
...
現在打開看看 http://localhost:8080/login ,好,成功顯示登入畫面!
因為有開啟註冊功能所以也能看到註冊按鈕!
如果要加入其他 OpenID ,比如 Google ,還是要去各服務開啟設定,再填進來。
這個登入網頁 app 和網站是共用的,也就是說,使用 Keycloak 省去的是設計畫面和傳統帳號密碼流程的時間。
至於 Api 和登入狀態的關係,還是要另外花時間處理。
明天是可怕的補班日,不知道還有沒有精力對付專案。
本次鐵人賽的作品在放進更多內容後已經成書,書名是《老姐要用Kotlin寫專案:從 Server 到 Android APP 的開發生存日記》,歡迎購買唷。https://www.tenlong.com.tw/products/9789864348978