7

iOS (Swift) アプリにUber の Request Endpointを実装しています。リクエスト API/エンドポイントには、アプリでのユーザー認証が必要です。ドキュメントはこちらです。

このために、このOauth2.0 ライブラリを使用しています

私がしたことは

  1. 指定されたインストール手順の助けを借りて、ライブラリをプロジェクト(xCode)に正常に統合しました。

  2. In My AppDelegate

    let uber_OAuth_Settings = [
    "client_id": "XXXXXXX9vtKzobvXXXXXX",
    "client_secret": "EXXXXXXXXyFUNCa_Wez6AXXXXXXXnrXtxus",
    "authorize_uri": "https://login.uber.com/oauth/authorize",
    "token_uri": "https://login.uber.com/oauth/token",
    "redirect_uris": ["jamesappv2://oauth/callback"],   // don't forget to register this scheme
    ] as OAuth2JSON
    

    var oauth:OAuth2CodeGrant!

  3. didFinishLaunchingWithOptionsのAppdelegateの方法で

     oauth = OAuth2CodeGrant(settings: uber_OAuth_Settings)
    oauth.viewTitle = "Uber Login Service"      // optional
    oauth.verbose = true // For Logs
    
  4. URL スキームを登録することを忘れないでください ( "redirect_uris": ["jamesappv2://oauth/callback"])

アプリのターゲットに移動 -> 情報タブ -> URL タイプ -> (+) をクリックし、画像を添付

ここに画像の説明を入力

  1. AppDelegate で、以下に指定されたメソッドを追加し、コールバック URL を処理します

    func application(application: UIApplication,
    openURL url: NSURL,
    sourceApplication: String?,
    annotation: AnyObject?) -> Bool {
        // you should probably first check if this is your URL being opened
    
       var splitUrl = url.absoluteString!.componentsSeparatedByString(":")
    
        if splitUrl[0] == ("jamesappv2") {
    
            oauth.handleRedirectURL(url)
        }
    
        return true
    }
    
  2. 今、私のviewControllerで、myBtnClickでこれが好きでした

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    
    let url = appDelegate.oauth.authorizeURL()
    UIApplication.sharedApplication().openURL(url)        
    appDelegate.oauth.onAuthorize = { parameters in
        println("Did authorize with parameters: \(parameters)")
    
        self.navigationController?.pushViewController(self.PersonalDriverUber_VC, animated: true)
    //On Authorization Goto another ViewController using pushViewController of navigationcontroller Method
    
    }
    appDelegate.oauth.onFailure = { error in        // `error` is nil on cancel
        if nil != error {
            println("Authorization went wrong: \(error!.localizedDescription)")
        }
    }
    

これが私のデバッグ ログです。有効な応答が得られています。

    OAuth2: Handling redirect URL jamesappv2://oauth/callback?state=4B0EB812&code=0sXXXXXXTX7yEbS1XXXXXHuw
OAuth2: Successfully validated redirect URL
OAuth2: Authorizing against https://login.uber.com/oauth/token?state=38158941&grant_type=authorization_code&code=0sXXXXXXXX1jxTrdFQT9Huw&client_secret=EIXXXXXXXNCa_Wez6XXXXXw0BlnrXtxus&client_id=fXXXXXXXy2LOUo9vtKXXXXXQ1nUDO&redirect_uri=jamesappv2%3A%2F%2Foauth%2Fcallback
OAuth2: Exchanging code 0swNXXXXX7yXXXXXXdFQT9Huw with redirect jamesappv2://oauth/callback for token at Optional("https://login.uber.com/oauth/token")
OAuth2: Did receive access token: Dfq3XXXXXXuWgpaqFXXXXXXXgXW, refresh token: EmStT7FEXHRMlS8odPzs1nsha0ObjK
Did authorize with parameters: [token_type: Bearer, expires_in: 2592000, access_token: XXXXXXOZuWgXXXXXXXXuJYOmgXW, refresh_token: EXXXXXHRMlS8oXXXXXXXa0ObjK, scope: profile, last_authenticated: 1430121470]

有効な access_token を取得していることに注意してください

ここで私は立ち往生しています

DOCの STEP4 のとおり*USE BEARER TOKEN

レスポンスで返された access_token を Authorization ヘッダーにタイプ Bearer で渡して、ユーザーに代わってリクエストを作成します。

curl -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' 'https://api.uber.com/v1/products?latitude=37.7759792&longitude=-122.41823'

要点がわかりません。タイプ Bearer の Header で access_token を渡すにはどうすればよいですか? 私は以下のようにしました

func callRequestAPI(url:String){

    let request = appDelegate.oauth.request(forURL: NSURL(string:url)!)



    request.HTTPMethod = "POST"


    let postString = "product_id="+selectedUberProductId+"&start_latitude="+start_lat+"&start_longitude="+start_lng+"&end_latitude="+end_lat+"&end_longitude="+end_lng

    println(postString)


    let tempData: NSData = appDelegate.oauth.accessToken.dataUsingEncoding(NSUTF8StringEncoding)!
    let base64LoginString = tempData.base64EncodedStringWithOptions(nil)

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")




   request.setValue("Bearer \(base64LoginString)", forHTTPHeaderField: "Authorization")

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request) { data, response, error in


        if error != nil {
            println("error=\(error)")
            return
        }

        println("response = \(response)")

        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString)")

    }
    task.resume()
}

しかし、私は次の応答を得ています

response = <NSHTTPURLResponse: 0x1a284b50> { URL: https://sandbox-api.uber.com/v1/requests } { status code: 401, headers {
"Content-Length" = 75;
"Content-Type" = "application/json";
Date = "Mon, 27 Apr 2015 10:22:01 GMT";
Server = nginx;
"Strict-Transport-Security" = "max-age=31536000; includeSubDomains; preload";
"x-uber-app" = "uberex-sandbox";
"x-xss-protection" = "1; mode=block";
} }
responseString = Optional({"message":"Invalid OAuth 2.0 credentials provided.","code":"unauthorized"})
4

3 に答える 3

1

Swift 2 用に更新されました。Qadir が質問で説明したものと同じセットアップとライブラリを oauth に使用しました。Swift 2 で作業するという彼の要求を更新しました。これが他の人に役立つことを願っています。

ユーバーリクエスト:

    let params:[String:AnyObject] = [
        "product_id" : uberProduct,
        "start_latitude" : userLat,
        "start_longitude" : userLng,
        "end_latitude" : barLat,
        "end_longitude" : barLng]

    let urlPath = "https://sandbox-api.uber.com/v1/requests"
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    var session = NSURLSession(configuration: configuration)

    guard let endpoint = NSURL(string: urlPath) else { print("Error creating endpoint");return }

    let request = appDelegate.oauth.request(forURL: NSURL(string:urlPath)!)
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField:"Content-Type")

    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.PrettyPrinted)

    request.HTTPMethod = "POST"

    print("Prepare to make request -> \(request)")

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
        if error != nil{
            print("Error -> \(error)")
            return
        }

        do {
            let result = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)

            print("Result -> \(result)")

        } catch {
            print("Error -> \(error)")
        }
    }

    task.resume()

戻り値:

Result -> Optional(["driver": <null>, "request_id": 5834384c-7283-4fe6-88a7-e74150c6ab30, "surge_multiplier": 1, "location": <null>, "vehicle": <null>, "status": processing, "eta": <null>])
于 2016-02-06T05:09:39.623 に答える
0

トークンを使用するには、ライブラリ内の手順の手順 5 に従っOAuth2てください。これは、2 回目の署名を試みる前に行ったのと同じです。リクエストはすでに署名されており、Bearer トークンが設定されています。何もする必要はありません。

let url = NSURL(string: "https://api.uber.com/v1/products?latitude=37.7759792&longitude=-122.41823")
let req = appDelegate.oauth.request(forURL: url)

// customize your request, if needed. E.g. for POST:
req.HTTPMethod = "POST"

// send the request
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(req) { data, response, error in
    if nil != error {
        // something went wrong
    }
    else {
        // check the response and the data
        // you have just received data with an OAuth2-signed request!
    }
}
task.resume()
于 2015-04-27T13:53:27.077 に答える