在 iOS 上做 EVE SSO 授权失败

发布于 2022-09-01 15:49:25 字数 2301 浏览 23 评论 0

我在iOS上做 EVE Online 的 SSO授权

首先跳转至网页进行登录并回调:

swiftUIApplication.sharedApplication().openURL(NSURL(string: "https://login.eveonline.com/oauth/authorize?response_type=code&redirect_uri=eve%3A%2F%2Fcallback&client_id=97501bccc99b40b69b349dc7277621d8&scope=publicData")!)

用户被定向至Safari登录完成后,由预先定义的 URL Scheme 返回应用,并附带用于授权的code:

swiftfunc parseScheme(url: NSURL) ->Bool {
        var authCode = ""

        if let params = url.query {

            for param in params.componentsSeparatedByString("&") {

                let pair = param.componentsSeparatedByString("=")

                if pair[0] == "code" {
                    authCode = pair[1]
                    print("Code: \(authCode)", appendNewline: true)
                    CRest.sharedInstance.verifyAuthCode(authCode)
                }
            }
        }

        return true
    }

取得code后,向服务器发送授权验证请求:

swiftfunc verifyAuthCode(code: String) {
     let authStrBuff = CLIENT_ID + ":" + CLIENT_SECRET

     let authData = authStrBuff.dataUsingEncoding(NSUTF8StringEncoding)

     let authStr = authData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding76CharacterLineLength).stringByReplacingOccurrencesOfString("\r\n", withString: "")

     let headers = ["Authorization": "Basic " + authStr!,
                     "Content-Type": "application/x-www-form-urlencoded",
                             "Host": "login.eveonline.com"]

     let params = ["grant_type": "authorization_code",
                         "code": code]

     Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = headers
     Alamofire.request(.POST, URLString: "https://login.eveonline.com/oauth/token", parameters: params).responseJSON { (req, res, JSON, err) -> Void in
         if let e = err {
             print(e, appendNewline: true)
         }

         print("\(JSON)", appendNewline: true)
     }
}

但是按照流程走下来之后授权失败,最终打印JSON结果如下:

{
    error = "invalid_client";
    "error_description" = "Unknown client";
}

求解答0.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绝對不後悔。 2022-09-08 15:49:25

解决方案已找到。

在Alamofire中,Alamofire.Manager.sharedInstance()有一个默认的Additional Header,但是实践证明无法更改,必须自行创建Alamofire.Manager实例。解决方案代码如下:

var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders as! [String: String]
for (key, value) in headers {
    defaultHeaders[key] = value
}

let config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.HTTPAdditionalHeaders = defaultHeaders
authManager = Alamofire.Manager(configuration: config)

authManager.request(.POST, "xxxxx", parameters: params, encoding: ParameterEncoding.URL)    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文