私はちょうどSwift(とても素敵な言語)でコーディングを始めました。ユーザーにサードパーティのログインサービスを使用してログインする必要があるアプリを作ろうとしています。返信が特定の値になるまでURLをポップ
認証フローの基本は次のようになります。 1.ユーザーはssn(swedish personnummer)を入力し、enterを押します。
2. JSONブロブを返すURLにPOST:
{
"transactionId": "a transaction id",
"expires": "date sting in some iso format",
"autostartToken": "irrelevant for my usage"
}
3ポーリング手順2
からこのURLをtransactionId
を使用するURLは、JSONブロブを返す:
{
"state": "OUTSTANDING_TRANSACTION",
// other stuff that's uninteresting
}
ユーザーがモバイル認証アプリを使用してアクセス権を付与すると、このURLはより複雑なjsonブロブを返します。 state
は「完了」に変わります。 4.状態が「完了」されると(ステップ3でブロブから得ることができる最後のURLから認証トークンを受信します。
5. ???
6.利益を!だから私の
」ステップ3を行う方法を(私の限られた迅速な知識で)本当に把握することができないということです。状態が「完了」(またはステップ2からの期限が過ぎて失敗する)になるまでURLをポーリングします。
私は、サービスを試してJavaScriptでハックの試みを行っている、それは一種の次のようになります。
this.postMethodThatReturnsAPromise(url, data).then(response => {
let {transactionId} = response.body;
let self = this,
max = 10,
num = 0;
return new Promise(function (resolve, reject) {
(function poll() {
self._get(`baseurl/${transactionId}`).then(res => {
let {state} = res.body;
if (state !== 'COMPLETE' && num < max) {
setTimeout(poll, 2000);
} else if (state === 'COMPLETE') {
return resolve(res);
}
});
num++;
})();
});
})
AlamofireとPromisekitを使用して迅速に3を行う方法はありますか?
return Alamofire.request(url, method: .post, /* rest is omitted */).responseJSON().then { response -> String in
let d = res as! Dictionary<String, Any>
return d["transactionId"]
}.then { transactionId -> [String: Any] in
// TODO: The polling until blob contains "state" with value "COMPLETED"
// Return the final json blob as dict to the next promise handler
}.then { data in
}