前提・実現したいこと
monacaでアプリを開発しています。ログイン認証するAPIから受け取ったcookieを別のAPIコール時に付加することができず困っています。
具体的にやりたいことは、
1.アプリのログイン画面で入力したID,パスワードをAPIに送信する。
2.APIは受信したID,パスワードを検証し問題なければcookie(認証用)を返す。
3.アプリはcookie(認証用)を保存する。
4.アプリの記事登録画面で入力した情報を、保存しているcookie(認証用)と共にAPIに送信する。
5.APIは受信したcookie(認証用)を検証し問題なければ記事登録を行う。
です。
質問は下記2点です。
-
monacaアプリでcookieを使用することはできるのでしょうか?ここ数日試行錯誤しているのですが解決しません。そもそもmonacaアプリでcookieは使用できるのか、と疑問に思った次第です。monacaアプリでcookieを登録するのではなく、APIからのcookie(サードパーティクッキー?)が使用できるのか、が知りたいです。
-
monacaアプリでcookieを使用することができる場合、どのような手続きが必要なのでしょうか?①axiosのオプションでwithCredentials: trueを設定する、②cookieにSameSite=None、Secure=trueの属性を付ける、以外に何かございましたらご教授いただきたいです。
【環境】
API側: Azure、IIS、ASP.NET
アプリ側: monaca、react、onsenui、axios、cordova10.0.0
発生している問題・エラーメッセージ
5でAPIがHTTPステータスコード401を返してしまいます。つまり4でcookie(認証用)がAPIに送信されていません。
さらに下記の理由からそもそも3でcookieが保存されていないのではないかと推測しました。
- 2のAPI側でcookie(認証用)が返されていることを確認済み。
- 4のAPI側でcookie(認証用)が付加されていないことを確認済み。
- localkit(または同様の機能を実装したWEBアプリ)では問題なくcookie(認証用)がアプリ側に保存されAPIに送信されています。
実機(iPhone8 iOS14.7.1)で上記問題が発生します。
該当のソースコード
ログインAPIを呼び出すコードは下記です。このAPIは正常終了します。
javascript
1 axios.post("https://aaabbbccc.com/api/login", {id: '99999', pw: '123456'}, {withCredentials: true}) 2 .then((response) => { 3 // 正常終了 4 if(response.status == 200){ 5 } 6 }) 7 .catch((error) => { 8 // エラー 9 if (error.response) { 10 if (error.response.status == 401) { 11 } 12 else { 13 } 14 } else if (error.request) { 15 } else { 16 } 17 }); 18
記事登録APIを呼び出すコードです。このAPIは401で返ってきます。
javascript
1 axios.post("https://aaabbbccc.com/api/article", {content: 'あいうえお'}, {withCredentials: true}) 2 .then((response) => { 3 // 正常終了 4 if(response.status == 200){ 5 } 6 }) 7 .catch((error) => { 8 // エラー 9 if (error.response) { 10 if (error.response.status == 401) { 11 alert('認証されていません'); 12 } 13 else { 14 } 15 } else if (error.request) { 16 } else { 17 } 18 }); 19
試したこと
下記を参照しAPI側のcookieにSameSite=None、Secure=trueが設定されるようにしました。
[Monaca] Web APIリクエスト時にCookie認証情報が渡されない
また、IIS側に下記設定を追加しました。
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:monaca-app://monaca.io ← config.xmlに設定したもの