从移动应用程序调用休息服务器

时间:2018-05-10 07:42:56

标签: hyperledger-composer

继续https://lists.hyperledger.org/g/composer/message/91

我在我的IOS应用程序中采用了Caroline Church描述的方法。 我可以再次使用谷歌进行身份验证,但在发布时仍然会收到401授权错误。

我已将afterCredentials参数添加到POST请求中的http标头。

其余服务器是否在cookie中传回令牌?我没有从其他服务器收到任何回复信息。

withCredentials从何处获取凭据?

COMPOSER_PROVIDERS如下

COMPOSER_PROVIDERS='{
    "google": {
        "provider": "google",
        "module": "passport-google-oauth2",
        "clientID": "93505970627.apps.googleusercontent.com",
        "clientSecret": "",
        "authPath": "/auth/google",
        "callbackURL": "/auth/google/callback",
        "scope": "https://www.googleapis.com/auth/plus.login",
        "successRedirect": "myAuth://",
        "failureRedirect": "/"
    }
}'

successRedirect指向我的应用程序。成功通过身份验证后,我将返回App。

3 个答案:

答案 0 :(得分:1)

现在有了这个工作。该应用程序首先通过谷歌进行身份验证,然后与其余服务器交换授权代码。

需要更改Rest服务器COMPOSER_PROVIDERS以关联回应用程序。 clientID是谷歌中的应用ID, callbackURL和successRedirect是reversed_clientID://

应用程序使用授权码作为参数调用http://localhost:3000/auth/google/callback

此调用将失败,但会写回一个access_token cookie,其中包含其余服务器所需的访问令牌。

登录用户的用户ID不会被传回,当与谷歌交换令牌代码时,我们会使用登录用户的详细信息返回JWT。我们需要从休息服务器以及令牌返回。有没有办法得到这个?

更改COMPOSER_PROVIDERS意味着Rest服务器的资源管理器界面不再有效。

答案 1 :(得分:1)

func getRestToken(code: String) {        
    let tokenURL = "http://localhost:3000/auth/google/callback?code=" + code

    let url = URL(string:tokenURL);

    var request = URLRequest(url: url!);

    request.httpMethod = "GET";

    request.setValue("localhost:3000", forHTTPHeaderField: "Host");

    request.setValue("text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8", forHTTPHeaderField: "Accept");
    request.setValue("1", forHTTPHeaderField: "Upgrade-Insecure-Requests");

    request.httpShouldHandleCookies = true;
    request.httpShouldUsePipelining = true;

    let session = URLSession.init(configuration: .default);
    session.configuration.httpCookieAcceptPolicy = .always;
    session.configuration.httpShouldSetCookies=true;
    session.configuration.httpCookieStorage = HTTPCookieStorage.shared;

    let task = session.dataTask(with: request) { (data, response, error) in
            var authCookie: HTTPCookie? = nil;
            let sharedCookieStorage = HTTPCookieStorage.shared.cookies;

            // test for access_token
            for cookie in sharedCookieStorage! {
                if cookie.name == "access_token"
                {
                    print(“Received access token”)
                }
            }

            guard error == nil else {
                print("HTTP request failed \(error?.localizedDescription ?? "ERROR")")
                return
            }
            guard let response = response as? HTTPURLResponse else {
                print("Non-HTTP response")
                return
            }
            guard let data = data else {
                print("HTTP response data is empty")
                return
            }

            if response.statusCode != 200 {
                // server replied with an error
                let responseText: String? = String(data: data, encoding: String.Encoding.utf8)

                if response.statusCode == 401 {
                    // "401 Unauthorized" generally indicates there is an issue with the authorization
                    print("Error 401");
                } else {
                    print("HTTP: \(response.statusCode), Response: \(responseText ?? "RESPONSE_TEXT")")
                }
                return
            }

        }

    task.resume()

}

答案 2 :(得分:0)

您是否已授权Google OAUTH2配置中的重定向URI?

在用户完成授权流程后,这将确定API服务器重定向用户的位置。该值必须与API控制台中为项目列出的redirect_uri值之一完全匹配。请注意,http或https方案,大小写和尾部斜杠(' /')必须全部匹配。

这是Angular 5成功使用它Angular 5, httpclient ignores set cookie in post的一个例子,特别是底部的答案 Scope控制访问令牌允许的资源和操作集。在访问令牌请求期间,您的应用程序会在scope参数中发送一个或多个值。

请参阅https://developers.google.com/identity/protocols/OAuth2

设置withCredentials选项,以便创建cookie,将身份验证令牌传递给REST服务器。

最后,此资源可以帮助您https://hackernoon.com/adding-oauth2-to-mobile-android-and-ios-clients-using-the-appauth-sdk-f8562f90ecff