继续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。
答案 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服务器。