使用 Keycloak 后端嵌入式 Safari 浏览器而不是外部 Safari 浏览器的 AeroGear SSO 登录

AeroGear SSO Login using Keycloak backend Embedded Safari Browser Instead of External Safari Browser

我正在做一个需要 SSO 登录功能的项目,我已经实现了 AeroGear SSO 登录,但问题是它在 Safari 浏览器中打开身份验证网站(退出主应用程序然后打开浏览器)但我想要不让App去认证,有什么办法吗?我可以在应用程序中使用嵌入式 Web 视图,这将有助于在应用程序中对用户进行身份验证。

这是我使用的演示代码。 (Here 是示例代码的来源)

import UIKit

import AeroGearHttp
import AeroGearOAuth2

let HOST = "http://localhost:8080"

extension String {
/// Encode a String to Base64
func toBase64() -> String {
    return Data(self.utf8).base64EncodedString()
}

/// Decode a String from Base64. Returns nil if unsuccessful.
func fromBase64() -> String? {
    guard let data = Data(base64Encoded: self) else { return nil }
    return String(data: data, encoding: .utf8)
}
}

class ViewController: UIViewController {
var userInfo: OpenIdClaim?
var keycloakHttp = Http()
var images: [UIImage] = []
var currentIndex = 0
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from 
 a nib.
 }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func goPreviousImage(_ sender: UIButton) {
    if  self.currentIndex > 0 {
        self.currentIndex -= 1
    }
    self.imageView.image = self.images[self.currentIndex]
}

@IBAction func goNextImage(_ sender: UIButton) {
    if  self.currentIndex < self.images.count - 1{
        self.currentIndex += 1
    }
    self.imageView.image = self.images[self.currentIndex]
}



@IBAction func loginAsKeycloak(_ sender: AnyObject) {
    let keycloakConfig = KeycloakConfig(
        clientId: "sharedshoot-third-party",
        host: HOST,
        realm: "shoot-realm",
        isOpenIDConnect: true)
    let oauth2Module = AccountManager.addKeycloakAccount(config: 
     keycloakConfig)
    self.keycloakHttp.authzModule = oauth2Module
    oauth2Module.login {(accessToken: AnyObject?, claims: 
     OpenIdClaim?, error: NSError?) in
        self.userInfo = claims
        if let userInfo = claims {
            if let name = userInfo.name {
                self.nameLabel.text = "Hello \(name)"
            }
        }

我只加了一行就得到了解决方案

keycloakConfig.webView = .embeddedWebView // Open webview within the app

设置KeyCloak Config后添加这一行。这是如何做到的

   let keycloakConfig = KeycloakConfig(
    clientId: "sharedshoot-third-party",
    host: HOST,
    realm: "shoot-realm",
    isOpenIDConnect: true)

keycloakConfig.webView = .embeddedWebView // Open webView within the app

let oauth2Module = AccountManager.addKeycloakAccount(config: 
 keycloakConfig)
self.keycloakHttp.authzModule = oauth2Module
oauth2Module.login {(accessToken: AnyObject?, claims: 
 OpenIdClaim?, error: NSError?) in
    self.userInfo = claims
    if let userInfo = claims {
        if let name = userInfo.name {
            self.nameLabel.text = "Hello \(name)"
        }
    }