如何在没有重定向通用登录页面的情况下直接在Auth0中登录? [英] How to login directly in Auth0 without redirect universal login page?

查看:109
本文介绍了如何在没有重定向通用登录页面的情况下直接在Auth0中登录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在进行Auth0集成,我已在我的Swift项目中成功集成了Auth0 SDK,但我想从我的应用程序实现直接登录,而无需重定向到Auth0通用登录页面.

I'm working on Auth0 integration, i successfully integrated Auth0 SDK in my Swift project, but i want to implement direct login from my app with out redirect into Auth0 universal login page.

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

I studied mobile login flow here (https://auth0.com/docs/flows/concepts/mobile-login-flow ).

我在iOS Swift中实现了Auth0登录,它正在运行.但是我要直接登录.

I implemented Auth0 login in iOS Swift it's working. But i want direct login.

查看我的屏幕

当我们单击我的应用程序中的登录名时,它会弹出.

When we click login in my app it shows pop up.

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

Click continue it will open Auth0.com page (I don't want this page, i want direct login with out this page How?)

我不希望该页面,我想通过mu应用程序登录页面直接登录,而无需通过此页面登录.

I don't want this page, i want direct login with out this page through mu app login page, How?.

有可能吗?.

为此,我点击了此链接

For this i followed this link https://auth0.com/docs/flows/guides/mobile-login-flow/add-login-using-mobile-login-flow and implemented code_verifier and code_challage. But when i implement Authorize the User it's given 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()

}

推荐答案

如果要避免显示同意屏幕并重定向到auth0托管的登录页面,则可以将身份验证API与

If you want to avoid the consent screen and redirection to auth0 hosted login page, you can use authentication API with password-realm grant type. The disadvantages are:

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

如上所述:

身份验证API公开了Auth0的AuthN/AuthZ功能以及受支持的身份协议,如OpenID Connect,OAuth 2.0和SAML.我们建议您使用托管登录页面,但是如果您希望构建自己的UI,则可以使用我们的API端点来进行.但是,默认情况下会禁用某些Auth流(Grant类型),因此您需要按照本指南中的说明通过Auth0仪表板启用它们.

The Authentication API exposes AuthN/AuthZ functionality of Auth0, as well as the supported identity protocols like OpenID Connect, OAuth 2.0, and SAML. We recommend using our Hosted Login Page but if you wish to build your own UI you can use our API endpoints to do so. However some Auth flows (Grant types) are disabled by default so you will need to enable them via your Auth0 Dashboard as explained in this guide.

登录:

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

这篇关于如何在没有重定向通用登录页面的情况下直接在Auth0中登录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆