Вход в AeroGear SSO с использованием бэкэнда Keycloak Встроенный браузер Safari вместо внешнего браузера Safari - PullRequest
0 голосов
/ 23 февраля 2019

Я работаю над проектом, в котором требуется функция входа в систему единого входа. Я реализовал вход в систему единого входа AeroGear, но проблема в том, что он открывает веб-сайт аутентификации в браузере Safari (выходит из основного приложения и затем открывает браузер). Но я не хочу этого делать.оставить приложение для аутентификации, есть ли способ?Я могу использовать встроенное веб-представление в приложении, которое будет полезно для аутентификации пользователя в приложении.

Вот демонстрационный код, который я использую.( Здесь является источником кода примера)

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)"
            }
        }

1 Ответ

0 голосов
/ 23 февраля 2019

Я получил решение, просто добавив одну строку

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

Добавьте эту строку после настройки конфигурации KeyCloak.Вот как это сделать

   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)"
        }
    }
...