首页 > 解决方案 > 如何在没有重定向通用登录页面的情况下直接在 Auth0 中登录?

问题描述

我正在研究 Auth0 集成,我在我的 Swift 项目中成功集成了 Auth0 SDK,但我想从我的应用程序实现直接登录,而不重定向到 Auth0 通用登录页面。

我在这里研究了移动登录流程(https://auth0.com/docs/flows/concepts/mobile-login-flow )。

我在 iOS Swift 中实现了 Auth0 登录,它正在工作。但我想直接登录。

查看我的屏幕

当我们在我的应用程序中单击登录时,它会弹出。 在此处输入图像描述

单击继续它将打开 Auth0.com 页面(我不想要这个页面,我想直接登录没有这个页面如何?)

在此处输入图像描述

我不想要这个页面,我想通过mu app登录页面直接登录没有这个页面,如何?。

可能吗?。

为此,我点击了此链接https://auth0.com/docs/flows/guides/mobile-login-flow/add-login-using-mobile-login-flow并实施了 code_verifier 和 code_challage。但是当我实现Authorize the User时,它会给出html response

我的代码是:

func codeVerifier() {
    var buffer = [UInt8](repeating: 0, count: 32)
    _ = SecRandomCopyBytes(kSecRandomDefault, buffer.count, &buffer)
    let verifier = Data(bytes: buffer).base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "$_")
        .replacingOccurrences(of: "=", with: "")
        .trimmingCharacters(in: .whitespaces)

    print("Code_Verifier : \(verifier)")

    codeChallenger(verifier: verifier)
}

func codeChallenger(verifier:String) {
    // Dependency: Apple Common Crypto library
    // http://opensource.apple.com//source/CommonCrypto
    guard let data = verifier.data(using: .utf8) else {

        return
    }

    var buffer = [UInt8](repeating: 0,  count: Int(CC_SHA256_DIGEST_LENGTH))
    data.withUnsafeBytes {
        _ = CC_SHA256($0, CC_LONG(data.count), &buffer)
    }
    let hash = Data(bytes: buffer)
    let challenge = hash.base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "$_")
        .replacingOccurrences(of: "=", with: "")
        .trimmingCharacters(in: .whitespaces)

    print("Code_Challenger : \(challenge)")

    authorizwTheUser(code_challange: challenge)
}

func authorizwTheUser(code_challange:String) {

    let url = "https://domain.auth0.com/authorize?"

    var request = URLRequest(url: URL(string: url)!)

            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            request.httpMethod = "GET"

            print("URL : \(request)")

    let parameters = "response_type=token&code_challenge=\(code_challange)&code_challenge_method=S256&client_id=&redirect_uri=com.myappname.Auth0DemoSwift://domainname.auth0.com/ios/com.domainname.Auth0DemoSwift/callback&scope=openid profile&state=xyzABC123x"

    request.httpBody = parameters.data(using: .utf8)

    print(parameters)

            let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error
                print("error=\(String(describing: error))")
                return
                }

                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
                    print("statusCode should be 200, but is \(httpStatus.statusCode)")
                    print("response = \(String(describing: response))")
                }

                                            // If Response is in String formate
                                            let responseString = String(data: data, encoding: .utf8)
                                            let dictionary = data
                                            print("dictionary = \(dictionary)")
                                            print("responseString = \(String(describing: responseString!))")

                do {
                    let response = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject]
                    print(response!)

                    let res = response!["Response"]
                    let status = res!["status"] as! String

                    if status == "SUCCESS" {

                    } else {

                    }

                } catch let error as NSError {
                    print(error)
                }
            }

            task.resume()

}

标签: iosswiftoauth-2.0auth0auth0-lock

解决方案


如果您想避免同意屏幕并重定向到 auth0 托管登录页面,您可以使用 authentication API with password-realm grant type。缺点是:

  • 没有单点登录
  • 您需要开发自己的 UI
  • 易于使用的蛮力攻击(在仪表板中启用蛮力保护)

如所述:

身份验证 API 公开了 Auth0 的 AuthN/AuthZ 功能,以及支持的身份协议,如 OpenID Connect、OAuth 2.0 和 SAML。我们建议使用我们的托管登录页面,但如果您希望构建自己的 UI,您可以使用我们的 API 端点来执行此操作。但是,默认情况下禁用某些身份验证流程(授权类型),因此您需要通过 Auth0 仪表板启用它们,如本指南中所述。

登入:

Auth0.authentication()
     .login(
        usernameOrEmail: "support@auth0.com",
        password: "secret-password",
        realm: "Username-Password-Authentication",
        scope: "openid"
     )
     .start { result in
         switch result {
         case .success(let credentials):
            print("Obtained credentials: \(credentials)")
         case .failure(let error):
            print("Failed with \(error)")
         }
     }

注册:

Auth0.authentication()
     .createUser(
        email: "support@auth0.com",
        password: "secret-password",
        connection: "Username-Password-Authentication",
        userMetadata: ["first_name": "First",
                       "last_name": "Last"]
     )
     .start { result in
        switch result {
        case .success(let user):
            print("User Signed up: \(user)")
        case .failure(let error):
            print("Failed with \(error)")
        }
     }

它记录在这里:https ://github.com/auth0/Auth0.swift#authentication-api-ios--macos--tvos


推荐阅读