2017-02-21 6 views
1

私は自分のプロジェクトでuberを使って認証しようとしています.uberのネイティブアプリに行き、自分のアプリケーションに戻るためのパスは大丈夫です。ただし、TokenStringとExpirationDateを返すだけで、refreshTokenはnilとして返されます。ここでRefresh Token uber swift returns nil

は私のコードは

AuthorizationBaseViewController

class AuthorizationBaseViewController: UIViewController { 

    func delay(delay: Double, closure:()->()) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay*Double(NSEC_PER_SEC))), dispatch_get_main_queue(), closure) 
    } 

    func showMessage(message: String) { 
     let alert = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
     let okayAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) 
     alert.addAction(okayAction) 
     self.presentViewController(alert, animated: true, completion: nil) 
    } 

    func checkError(response: Response) { 
     // Unauthorized 
     if response.statusCode == 401 { 
      TokenManager.deleteToken() 
      dispatch_async(dispatch_get_main_queue(), { 
       self.reset() 
      }) 
     } 
    } 

    func reset() { 

    } 

    // Mark: LoginButtonDelegate 

    func loginButton(button: LoginButton, didLogoutWithSuccess success: Bool) { 
     if success { 
      showMessage(NSLocalizedString("Integration with uber canceled.", comment: "")) 
     } 
    } 

    func loginButton(button: LoginButton, didCompleteLoginWithToken accessToken: AccessToken?, error: NSError?) { 
     if let _ = accessToken { 


      print(accessToken?.tokenString) 
      print(accessToken?.expirationDate) 
      print(accessToken?.refreshToken) 

      showMessage(NSLocalizedString("Uber user authenticated successfully.", comment: "")) 
      if let url = NSURL(string: "xxxxxxxxxxxxxx") { 
       let request = NSMutableURLRequest(URL: url) 
       request.HTTPMethod = "POST" 
       request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 
       let token = AccessToken?() 
       let jsonObject = ["token" : (token?.tokenString)!, "refresh_token" : (token?.refreshToken)!,"expires_in" : (token?.expirationDate)!, "user_id" : "uber_uuid" , "token_type" : "Bearer"] as Dictionary <String,AnyObject> 

       request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(jsonObject, options: []) 

       NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
        guard 
         let data = data where 
         error == nil && 
          (response as? NSHTTPURLResponse)?.statusCode == 200 
         else { 
          print((response as? NSHTTPURLResponse)?.statusCode ?? "no status code") 
          print(error?.localizedDescription ?? "no error description") 
          return 
        } 
        print(String(data: data, encoding: NSUTF8StringEncoding) ?? "no string from data") 
        }.resume() 
      } 
      showMessage((error?.localizedDescription)!) 



     } else if let error = error { 
      showMessage(error.localizedDescription) 
     } else { 
      showMessage("Error") 
     } 
    } 
} 

あるLoginViewController

class ImplicitGrantLoginViewController: AuthorizationBaseViewController, LoginButtonDelegate { 


    /// The LoginManager to use for login 
    let loginManager = LoginManager(loginType: .Native) 

    /// The RidesClient to use for endpoints 
    let ridesClient = RidesClient() 

    // The Uber button to use for UI 

    var uberLoginButton: LoginButton? 

    // The Uber Scopes 

    var uberScopes: [RidesScope]? 

    @IBOutlet weak var logoutBgView: UIView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     //UberScopes to get authentication 

     uberScopes = [.History, .Profile, .HistoryLite,.Places, .RideWidgets] 

     uberLoginButton = LoginButton(frame: CGRectZero,scopes:uberScopes! ,loginManager: loginManager) 


     // Uber Login Button Creation 

     let loginButton = LoginButton(frame: CGRectZero, scopes: uberScopes!, loginManager: loginManager) 
     loginButton.presentingViewController = self 
     loginButton.delegate = self 
     loginButton.frame = logoutBgView.bounds 
     loginButton.autoresizingMask = 
      [.FlexibleWidth, .FlexibleHeight] 
     logoutBgView.addSubview(loginButton) 


    } 

リフレッシュトークンは、自分のアプリケーションに戻っている場合は、基本的に、POSTリクエストはTokenStringと一緒に作られており、有効期限

Whe n個の認証は、行われ、認可ビューを表示する前に、それが次のエラー

MyAppに表示される[18136:615342] -canOpenURLを:URLに失敗しました:「uberauth://?接続third_party_app_name = MyAppの& callback_uri_string = XXXXXX & CLIENT_ID = XXXXXXXXXX & login_type =デフォルト&範囲=履歴%20profile%20history_lite%20places%20ride_widgets & SDK = IOS & sdk_version = 0.6.0

あっても、このエラーで、スコープを承認する画面が表示されたときにIヒットする私は、リフレッシュトークンがnilであり、HTTPリクエストがそれを受信して​​いないため、アプリケーションがクラッシュするが、デバッグ領域でリターンを参照してください。

l エラーAppクラッシュが原因refreshtokenに私はすでにplistファイルをチェックし、応じユーバーのドキュメント/ githubのリポジトリのを埋める

nilです。コールバックURI、LSApplicationQuerieScheme、クライアントID、DisplayNameは正しいです。

+0

[README](https://github.com/)で提案されているセキュリティの変更が不足していると思われるエラーメッセージに基づき、 uberauthへの呼び出しを可能にするためにuber/rides-ios-sdk#configuration-ios-90)を使用します。 – agraebe

+0

@agraebe LSApplicationQuerieSchemesで既にこれを設定しました – breadevelopment

+0

なぜリフレッシュトークンを気にしますか?それはオプションであるとマークされているので、あなたはそこにいないように準備する必要があります。 –

答えて

2

あなたの質問を通して私はいくつかの問題を参照してください。 UberアプリからNativeにログインしようとしているようです。アクセストークンと更新トークンが返されます。 Nativeログインを行っていない場合は、リフレッシュトークンが取得されず、それがnilになります。

あなたが記載されたエラーメッセージ:

のMyApp [18136:615342] -canOpenURLは:URLに失敗しました: 「uberauth://?接続third_party_app_name = MyAppの & callback_uri_string = XXXXXX &のclient_id = XXXXXXXXXX & login_type =デフォルト&範囲=歴史%20profile%20history_lite%20places%20ride_widgets & SDK = IOS & sdk_version = 0.6.0

LSApplicationQueriesSchemesの下にuberauthをあなたのアプリのplistに追加していないことを意味します。私はあなたがLSApplicationQuerieSchemeのスペルが間違っていると言いました。だから、そこにあなたの問題があるかもしれません。

あなたは、承認コード画面がまだ表示されていると言いますが、リフレッシュトークンを返さないウェブビューではImplicit Grantに戻っていると思います。

はまた、あなたがあなたのポストの要求を行っている場合は、あなたが戻って取得アクセストークンを使用することはありません提供されたコードで:

let token = AccessToken?() 
let jsonObject = ["token" : (token?.tokenString)!, 
        "refresh_token" : (token?.refreshToken)!, 
        "expires_in" : (token?.expirationDate)!, 
        "user_id" : "uber_uuid" , 
        "token_type" : "Bearer"] as Dictionary <String,AnyObject> 

あなたは、新しい空のAccessTokenを初期化し、その後にアンラップいくつかのオプションの値を強制しますそのトークン(ではなく、最初のログインから戻ったもの)。これらの値はほぼ確実にゼロであり、アンラップがクラッシュを引き起こしています