【问题标题】:redirect uri causing issues when navigating to an oauth url导航到 oauth url 时重定向 uri 会导致问题
【发布时间】:2015-09-20 22:07:41
【问题描述】:

我正在尝试导航到 Microsoft Live oauth authentication 页面,以便我可以授权我的用户并获取一个令牌供应用程序使用。当我使用以下NSURL 字符串时,我可以导航到该站点并授权我的应用程序,检索令牌。

let stringUrl = "https://login.live.com/oauth20_authorize.srf?client_id=\(clientId)&scope=\(scope)&response_type=code"
let url = NSURL(string: stringUrl)!

但是,我想重定向回我的应用(使用 SFSafariViewController)。为此,我在我的应用程序中添加了一个 URL Scheme,并将其作为 URL 中的 redirect_uri 传递。

let stringUrl = "https://login.live.com/oauth20_authorize.srf?client_id=\(clientId)&scope=\(scope)&response_type=code&redirect_uri=Lifestream://onedrive-oauth-callback"
let url = NSURL(string: stringUrl)!

但是,实时登录站点给了我一个错误,说出现了问题并且无法继续。在显示 oauth 登录页面之前发生此错误。它在导航到 URL 时立即发生。

我是否错误地创建了我的 URL 方案,或者不正确地将方案传递给了重定向 uri?我很困惑为什么没有redirect_uri它可以正常工作,但是当我提供它时网站无法加载。

有人可以指出我应该如何将我的应用程序的重定向 URL 传递到 oauth 重定向中吗?

更新

Microsoft 似乎不允许您注册作为应用 URL 方案的重定向 URL。我不知道如何将这些信息返回到我的应用程序中,除了支付一个我可以指向 MSFT 的网站之外,它只会为我重定向到应用程序中。

【问题讨论】:

  • 对我来说,这听起来像是 Microsoft 无法识别您的重定向 URI。您是否向 Microsoft 注册了该重定向 URI? OAuth 2 规范指出,如果重定向 URI 未被识别,则授权流程应该停止并且 AP 显示失败消息 (see section 4.1.2.1)。我之前没有使用过 Microsoft 的 OAuth 服务(也没有使用过 App URL 方案),因此如果 Microsoft 不允许您将自定义 URI 注册为重定向 URI,我无法提供任何其他建议。
  • 请注意,无法识别的重定向 URI(显然还有客户端 ID)在某种程度上是独特的验证失败,因为它们是唯一两个不允许将错误发送到重定向端点的条件。通常,如果出现问题,您会返回一个错误代码,您的客户端应用程序可以决定如何处理它。由于 OAuth 提供者无法验证重定向 URI,因此他们不向其发送错误信息是有意义的,因为这可能会允许第三方出于恶意目的切换重定向 URI。
  • 谢谢,我看看能不能注册一下。如果没有,我将不得不看看其他人如何使用 oauth 和应用 URL 方案处理这些事情
  • 查看我的 Microsoft 设置后,确实看起来他们不支持 App URL 方案。我用它的屏幕截图更新了我的 OP。那我得想办法了
  • 这是我的一个有根据的猜测,但我猜要走的路是将 Web 服务器注册为您的重定向端点,并让它接受重定向并将它们转换为您的自定义 URL。我觉得这是一个不充分的描述,但已经晚了,这是我现在能做的最好的。

标签: swift oauth-2.0 nsurl


【解决方案1】:

我遇到了类似的 OAuth 问题,不想弄乱网络服务器,所以我做的事情有点厚颜无耻。制作一个 UIWebView 并将请求放在 Web 视图上。然后将其委托给您自己并将重定向 URL 传递给 http://localhost:8000(它可以是任何类似的东西,这并不重要)。然后在委托内部这样做:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
{
    if let URL = request.URL?.absoluteString
    {
        // This should be the redirect URL that you pass it can be anything like local host mentioned above.
        if URL.hasPrefix(redirectURL) 
        {
            // Now you can simply do some string manipulation to pull out the relevant components.
            // I'm not sure what sort of token or how you get it back but assuming the redirect URL is 
            // YourRedirectURL&code=ACCESS_TOKEN and you want access token heres how you would get it.
            var code : String?
            if let URLParams = request.URL?.query?.componentsSeparatedByString("&")
            {
                for param in URLParams
                {
                    let keyValue = param.componentsSeparatedByString("=")
                    let key = keyValue.first
                    if key == "code"
                    {
                        code = keyValue.last
                    }
                }
            }
            // Here if code != nil then it has the ACCESS_TOKEN and you are done! If its nil something went wrong.
            return false // So that the webview doesnt redirect to the dummy URL you passed.
        }
    }
    return true
}

这有点骇人听闻,但效果很好,您不需要任何服务器,也不需要应用程序上的重定向 URI,在我看来,这是一种很棒的方法。您可以针对 swift 2 进行优化,以通过使用警卫来减少缩进,但我在它出现之前就写了这个......

希望这会有所帮助!

【讨论】:

  • 我会试一试。目前我正在使用新的SFSafariViewController,它不允许您处理请求回调。我会拉出那个组件并尝试构建一个 Web 视图并尝试这个。
  • 啊,但这仅适用于 iOS 9,此解决方案可用于任何版本,而且它的工作方式与 SFSafariViewController 类似,因为它将用户始终保留在您的应用程序中。我将它用于 Uber API,因为我不想为我的 iOS 应用程序设置重定向 URI,而且效果很好。如果您遇到任何问题,请告诉我,只需确保更改字符串操作以满足您的需要。不确定 Microsoft 如何返回令牌。
  • 这让我觉得不安全。注册重定向 URI 的全部意义在于,令牌只能被发送回您注册的服务器。如果您正在注册 localhost,什么会阻止我在您的应用程序之外使用您的客户端 ID 并收集令牌?
  • 您只是将 localhost 注册为 Microsoft 作为重定向 URL,当 Microsoft 重定向到本地主机时您会立即捕获并阻止它发生。此外,它位于沙盒应用程序内的 UIWebView 内,因此它完全安全,因为没有外部应用程序可以访问它。您不需要使用只是示例的 localhost,您可以使用任何 URL,包括 google.com。整个想法是从应用程序内部拦截重定向并处理重定向 URL 加上您返回 false 以便从不实际调用重定向。
  • 这很好,我能够拦截重定向并获取我的令牌代码。感谢您的帮助。
猜你喜欢
  • 2020-12-01
  • 2023-03-27
  • 2011-01-12
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多