2015-07-03 64 views
0

我想導航到Microsoft Live oauth authentication頁面,以便我可以授權我的用戶並獲取該應用使用的令牌。當我使用以下NSURL字符串時,我可以導航到該網站並授權我的應用程序,檢索該令牌。重定向uri在導航到oauth url時導致問題

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)! 

info.plist file

然而在Live登錄網站給了我一個錯誤說出事了,它無法繼續。在顯示oauth登錄頁面之前發生此錯誤。它在導航到URL時立即發生。

我錯誤地創建了我的URL方案,或者將方案不恰當地傳遞給了重定向uri?我很困惑,爲什麼它沒有redirect_uri工作正常,但該網站無法加載,當我提供它。

Redirect issue

有人能指出我在,我應該如何通過重定向URL我的應用程序,爲OAuth的重定向正確的方向?

更新

看來,微軟不會讓你註冊一個重定向URL,它是一個應用程序的URL方案。我不知道如何將這些信息返回到我的應用程序中,除了支付可以指向MSFT的網站外,這些信息將不會爲我做任何事情,而只是重定向到應用程序中。

MSFT limitation

+1

對我來說,這聽起來像微軟不承認你的重定向URI。你有沒有註冊與微軟的重定向URI? OAuth 2規範說,如果重定向URI不被識別,認證流程應該暫停並且AP顯示一條失敗消息([參見4.1.2.1節](http://tools.ietf.org/html/) rfc6749#部分-4.1.2.1))。我之前還沒有使用微軟的OAuth服務(也沒有應用程序URL方案),所以如果微軟不讓您將自定義URI註冊爲重定向URI,我不能提供任何其他建議。 – justinpawela

+1

請注意,無法識別的重定向URI(和客戶端ID,顯然)在某種程度上是唯一的驗證失敗,因爲它們是唯一不允許將錯誤發送到您的重定向端點的兩個條件。通常情況下,如果出現問題,你會得到一個錯誤代碼,你的客戶端應用程序可以決定如何處理它。由於OAuth提供程序無法驗證重定向URI,因此它們不會向其發送錯誤信息,因爲這可能會允許第三方爲了惡意目的而切換重定向URI。 – justinpawela

+0

謝謝,我會看看,看看我是否可以註冊。如果不是,我將不得不看看其他人如何使用oauth和應用程序URL方案處理這些事情。 –

回答

2

我也有類似的OAuth的問題,並沒有與Web服務器想勾搭所以不是我做的事是有點厚臉皮。製作一個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在您的應用程序,它的真棒方式做到這一點,我意見。你可以優化這個快速2通過使用守衛減少縮進,但我寫這之前,它出來所以...

希望這會有所幫助!

+0

我會給這個鏡頭。目前我正在使用新的'SFSafariViewController',它不允許你處理請求回調。我將把這個組件拉出來,並嘗試構建一個Web視圖並嘗試這個。 –

+0

啊,但這隻適用於iOS 9這個解決方案可以用於任何版本,再加上它像SFSafariViewController一樣工作,因爲它始終保持用戶在您的應用程序。我用這個Uber API的原因是我不想爲我的iOS應用程序設置一個重定向URI,這很好。如果遇到任何問題,請告知我們,確保您更改字符串操作以滿足您的需求。不確定Microsoft如何返回令牌。 –

+0

這讓我感到不安全。註冊重定向URI的重點在於,令牌只能發送回註冊服務器。如果您正在註冊本地主機,那麼會阻止我在您的應用以外使用您的客戶端ID並獲取令牌? – justinpawela