2017-04-11 34 views
0

我試圖實現與離子云的驗證服務用戶登錄,並且寧願不表演科爾多瓦inAppBrowser。在認證錯誤(如密碼錯誤)的情況下,我希望在錯誤處理程序火災,但由於某些原因,這似乎永遠是這樣。如何處理與離子定製身份驗證登錄錯誤?

在我登錄組件的方法包含此:

let loginData = { 
    email: this.email, 
    password: this.password 
}; 
let loginOptions: AuthLoginOptions = { 
    inAppBrowserOptions: { 
    hidden: true 
    } 
}; 
this.auth.login('custom', loginData, loginOptions).then(() => { 
    console.log('login success'); 
}, (err) => { 
    console.log('login error', err); // <-- this never gets executed. 
}); 

我確信,我的身份驗證服務器的401 HTTP狀態和JSON體包含錯誤性質響應。這是代碼(PHP,Laravel 3):

public function get_login() 
    { 
    try { 
     $redirect_uri = CustomAuthentication::process(
     $_GET['token'], 
     $_GET['state'], 
     $_GET['redirect_uri'] 
    ); 
     return Redirect::to($redirect_uri); 
    } catch (\Exception $e) { 
     return Response::json(array(
     'ok' => false, 
     'error' => $e->getMessage(), 
     'code' => $e->getCode() 
    ), 401); 
    } 
    } 

我發現在GitHub上兩個問題,似乎相關:

顯然是沒有辦法當inAppBrowser被隱藏的時候讓這個工作。還是有另一種選擇?

如果現在還沒有辦法達到這個目的,那麼爲了給用戶提供一個很好的登錄流程,會有什麼替代方案呢,爲失敗的登錄嘗試提供一個有意義的錯誤消息呢?

我應該嘗試用可見inAppBrowser來實現這一點?如果是這樣,我可以在哪裏找到文檔或示例?

不幸的是,官方文檔並沒有多大的報道(http://docs.ionic.io/services/auth/custom-auth.html#login),我發現的教程已過時。

回答

1

我有同樣的問題!

在您的服務器中,當出現身份驗證錯誤而不是呈現JSON時,您必須重定向。

事情是這樣的:

public function get_login() 
    { 
    try { 
     $redirect_uri = CustomAuthentication::process(
     $_GET['token'], 
     $_GET['state'], 
     $_GET['redirect_uri'] 
    ); 
     return Redirect::to($redirect_uri); 
    } catch (\Exception $e) { 
     $redirect_uri = $_GET['redirect_uri'] . '&' . http_build_query([ 
      'error' => $e->getMessage(), 
      'state' => 401, 
      'code' => $e->getCode(), 
     ]); 
     return Redirect::to($redirect_uri); 
    } 
    } 

(很抱歉,如果有在代碼中的錯誤,我不知道Lavarel;))

這個代碼是基於https://github.com/ionic-team/ionic-cloud/issues/53#issuecomment-296369084

在Ruby on Rails世界:

error_params = { error: error, state: 401 } 
url = "#{params[:redirect_uri]}&#{error_params.to_query}" 
redirect_to url 

在我做這個變動之後馬上在我的服務器上,離子應用程序開始工作。

-1

anyErrors:any;

在控制器中。在HTML文件中

<div > 
 
     <ion-row > 
 
     <ion-item > 
 
      <ion-label text-wrap color=red color="primary" > 
 
    {{anyErrors}} 
 
    </ion-label> 
 
    </ion-item> 
 
     </ion-row> 
 
    </div>

所以在離子.TS將流向的html頁面的任何錯誤我用這個登錄頁面TS文件

this.auth.login('basic', details).then(() => { 
    this.isUserLoggedIn = true; // <------ Debug here (1) 
    this.currentUserData = this.user; 
    console.log(this.currentUserData); 
    return this.currentUserData; 
}, (err: IDetailedError) => { 
this.anyErrors= err; // map the error here 

}); 

。即在登錄提交按鈕下面,我有上面的div代碼。如果沒有錯誤,msg將不會顯示,如果有錯誤消息,它將顯示。