# Login Süreci Workflow başlatılmadan önce login sürecini yönetmek için random bir guid generate edilir ve süreç boyunca saklanır. Tüm workflow methodları bu guid ile çağrılır. **Örnek Guid :** 0dcb1457-d0d5-480f-b61a-781ffca2349e Login Workflowunu başlatmak için aşağıdaki url’e istek yapılır. GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/workflow/:workflowName/init workflowName=>amorphie-mobile-login ```bash= Response: { "state": "amorphie-mobile-login", "view-source": "state", "transition": [ { "transition": "amorphie-mobile-login", "type": null, "require-data": null, "has-view-variant": false } ] } ``` View-source alanı state olduğu için aşağıdaki istekde tip olarak state name olarak da state alanındaki değer gönderilir. Bu method ile gösterilecek sayfanın json hali alınır. GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/:transitionOrState/:name/view?type=flutterwidget => GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/state/amorphie-mobile-login/view?type=flutterwidget HEADER Accept-Language : en-EN transitionOrState=>state name=>amorphie-mobile-login ```bash= Response : { "name": "Flutter-component-login-start-mobile", "type": "FlutterWidget", "language": "en-EN", "navigation": "PushReplacement", "data": "latest", "body": { "type": "scaffold", "args": { "body": { "type": "safe_area", "args": { "child": { "type": "padding", "args": { "padding": { "left": 32, "right": 32 }, "child": { "type": "column", "crossAxisAlignment": "stretch", "args": { "children": [ { "type": "neo_icon", "args": { "iconUrn": "urn:local:images:login_lock:png", "height": 240, "padding": 16 } }, { "type": "neo_text_form_field", "args": { "dataKey": "username", "titleText": "T.C. Indetification Number", "labelText": "TCKN / VKN", "maxLength": 11, "keyboardType": "NeoKeyboardType.number", "padding": { "top": 24 } } }, { "type": "neo_text_form_field", "args": { "dataKey": "password", "titleText": "Password", "labelText": "Password", "obscureText": true, "maxLength": 6, "keyboardType": "NeoKeyboardType.number", "padding": { "top": 24 } } }, { "type": "row", "args": { "children": [ { "type": "expanded", "args": { "child": { "type": "neo_login_button", "args": { "transitionId": “amorphie-mobile-login”, "labelText": "LOGIN", "padding": { "top": 24 } } } } } ] } }, { "type": "spacer" }, { "type": "security_icon_widget", "args": { "paddingAll": 32 } } ] } } } } } } } } } ``` Daha sonra ekran üzerinde datalar post edilirse aşağıdaki istek yapılır POST https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/{{oluşturulmuş guid}}/transition/{{dinamik sayfa jsonunda butona karşılık gelen transitionId üstteki örnek için amorphie-mobile-login}} Header X-Device-Id : DeviceId gönderilmeli User : Random Guid Behalf-Of-User : Random Guid ```bash= Request {{Login Entity Datası}} ``` Workflow başlatıldıktan sonra SignalR Hub’a subscribe olunur ve hub dinlenmeye başlanır. Hub Url : https://pubagw6.burgan.com.tr/ebank/flow/hub/hubs/genericHub Header X-Device-Id : DeviceId gönderilmeli SendMessage eventleri hub üzerinden dinlenir. Örnek js : connection.on('SendMessage', (msg)=>{}); Burda msg hubtan gelen json serialized bir string formatıdır. Burdaki msg parse edilerek eventInfo,state,page.pageRoute.label gibi akışı yönlendirecek propertylere erişilebilir. Hub üzerinden gelen mesajlarda eventInfo = “worker-completed” state != “amorphie-mobile-login-end” || state != “amorphie-mobile-login-error-end” page.pageRoute.label != null Şartları sağlanıyorsa page.pageRoute.label alanındaki page adına göre uygulama üzerinde ilgili sayfaya yönlendirme yapılır. **Buradan gelebilecek page isimleri aşağıdaki gibidir.** **“OTP” =>** “Uygulama üzerinde otp sayfasına geçiş yapılması gerektiğinde” **“RESET_PASSWORD” =>** “Uygulama üzerinde reset password sayfasına geçiş yapılması gerektiğinde” **“SECURITY_IMAGE” =>** “Uygulama üzerinde güvenlik resmi seçme sayfasına geçiş yapılması gerektiğinde” **“SECURITY_QUESTION” =>** “Uygulama üzerinde güvenlik sorusu seçme sayfasına geçiş yapılması gerektiğinde” ## OTP ekranı üzerinde akışı ilerletme Önce Otp Ekranı tasarımı workflow üzerinden alınır. Oto sayfası geldiğinde aşağıdaki alanlara ne gönderilmesi gerektiği uygulama üzerinde hardcoded tutuluyor. Json Flutter GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/:transitionOrState/:name/view?type=flutterwidget HEADER Accept-Language : en-EN transitionOrState=>uygulama tarafındaki hardcoded değer name=>uygulama tarafındaki hardcoded name OTP ekranı için gerekli olan bilgiler Hubdan gelen mesaj içerisinden additionalData.phoneNumber ve additionalData.securityImage alanlarından alınabilir. Hub bu ekrana yönlendirme talebi yapıyorsa ekran üzerinde gösterilecek datayıda msg içerisinde gönderir. Daha sonra ekran üzerinde datalar post edilirken aşağıdaki istek yapılır POST https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/{{oluşturulmuş guid}}/transition/{{dinamik sayfa jsonunda butona karşılık gelen transitionId}} Header X-Device-Id : DeviceId gönderilmeli User : Random Guid Behalf-Of-User : Random Guid ```bash= Request {{Oto Entity Datası}} ``` ## Reset password ekranı üzerinde akışı ilerletme Önce Reset Password Ekranı tasarımı workflow üzerinden alınır. Reset Password sayfası geldiğinde aşağıdaki alanlara ne gönderilmesi gerektiği uygulama üzerinde hardcoded tutuluyor. Flutter Json Design GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/:transitionOrState/:name/view?type=flutterwidget HEADER Accept-Language : en-EN transitionOrState=>uygulama tarafındaki hardcoded değer name=>uygulama tarafındaki hardcoded name Daha sonra ekran üzerinde datalar post edilirse aşağıdaki istek yapılır POST https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/{{oluşturulmuş guid}}/transition/{{dinamik sayfa jsonunda butona karşılık gelen transitionId}} Header X-Device-Id : DeviceId gönderilmeli User : Random Guid Behalf-Of-User : Random Guid ```bash= Request {{Reset Password Entity Datası}} ``` ## Güvenlik resmi ekranı üzerinde akışı ilerletme Önce Güvenlik Resmi Ekranı tasarımı workflow üzerinden alınır. Güvenlik Resmi sayfası geldiğinde aşağıdaki alanlara ne gönderilmesi gerektiği uygulama üzerinde hardcoded tutuluyor. Flutter Json Design GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/:transitionOrState/:name/view?type=flutterwidget HEADER Accept-Language : en-EN transitionOrState=>uygulama tarafındaki hardcoded değer name=>uygulama tarafındaki hardcoded name Güvenlik resmi değiştirme ekranı için gerekli olan güvenlik resimleri listesi Hubdan gelen mesaj içerisinden additionalData.securityImages alanından alınabilir. Hub bu ekrana yönlendirme talebi yapıyorsa ekran üzerinde gösterilecek datayıda msg içerisinde gönderir. Daha sonra ekran üzerinde datalar post edilirse aşağıdaki istek yapılır POST https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/{{oluşturulmuş guid}}/transition/{{dinamik sayfa jsonunda butona karşılık gelen transitionId}} Header X-Device-Id : DeviceId gönderilmeli User : Random Guid Behalf-Of-User : Random Guid ```bash= Request {{Security Image Entity Datası}} ``` ## Güvenlik sorusu ekranı üzerinde akışı ilerletme Önce Güvenlik Sorusu Ekranı tasarımı workflow üzerinden alınır. Güvenlik Sorusu sayfası geldiğinde aşağıdaki alanlara ne gönderilmesi gerektiği uygulama üzerinde hardcoded tutuluyor. Flutter Json Design GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/:transitionOrState/:name/view?type=flutterwidget HEADER Accept-Language : en-EN transitionOrState=>uygulama tarafındaki hardcoded değer name=>uygulama tarafındaki hardcoded name Güvenlik sorusu değiştirme ekranı için gerekli olan güvenlik soruları listesi Hubdan gelen mesaj içerisinden additionalData.securityQuestions alanından alınabilir. Hub bu ekrana yönlendirme talebi yapıyorsa ekran üzerinde gösterilecek datayıda msg içerisinde gönderir. POST https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/{{oluşturulmuş guid}}/transition/{{dinamik sayfa jsonunda butona karşılık gelen transitionId}} Header X-Device-Id : DeviceId gönderilmeli User : Random Guid Behalf-Of-User : Random Guid Hub üzerinden gelen mesajın state değerine göre aşağıdaki şekilde yönlendirme yapılabilir. “amorphie-mobile-login-end” : “Akış başarılı sonuçlandı, Homepage’e yönlendirme yapılabilir. additionalData alanından access token,refresh token alınabilir”. “amorphie-mobile-login-error-end” : “Akış hatalı bitti. İşlem kesilmeli. message alanından hata mesajı alınabilir”. ## Sözleşme onay süreci Önce Sözleşme Ekranı tasarımı workflow üzerinden alınır. sözleşme listesi sayfası geldiğinde aşağıdaki alanlara ne gönderilmesi gerektiği uygulama üzerinde hardcoded tutuluyor. Flutter Json Design GET https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/:transitionOrState/:name/view?type=flutterwidget HEADER Accept-Language : en-EN transitionOrState=>uygulama tarafındaki hardcoded değer name=>uygulama tarafındaki hardcoded name Onaylanması gereken doküman listesi Hubdan gelen mesaj içerisinden additionalData.documents alanından alınabilir. Hub bu ekrana yönlendirme talebi yapıyorsa ekran üzerinde gösterilecek datayıda msg içerisinde gönderir. Doküman onayı aşağıdaki endpoint ile gerçekleştirilir. POST https://test-pubagw6.burgan.com.tr/ebanking/contract/document/Instance HEADER Authorization :Bearer additionalData.tempToken Request ```json= { "id": "{{$guid}}", "file-type": "pdf", "fileContextType": "base64", "file-name": "{{documentCode}}.pdf", "documentCode": "{{documentCode}}", "documentVersion": "{{minVersion}}", "reference": "{{referanceKey}}", "owner": "{{referanceKey}}", "fileContext": "{{pdfbase64}}" } ``` fileContext alanına hub dan gelen doküman url'lerinden dönen base64 değer eklenecek. id generate edilecek. Diğer alanlar hubdan gelen additionalData.documents içerisinden olduğu gibi alınacak. POST https://test-pubagw6.burgan.com.tr/ebanking/flow/instance/{{oluşturulmuş guid}}/transition/{{dinamik sayfa jsonunda butona karşılık gelen transitionId}} Header X-Device-Id : DeviceId gönderilmeli User : Random Guid Behalf-Of-User : Random Guid Hub üzerinden gelen mesajın state değerine göre aşağıdaki şekilde yönlendirme yapılabilir. “amorphie-mobile-login-end” : “Akış başarılı sonuçlandı, Homepage’e yönlendirme yapılabilir. additionalData alanından access token,refresh token alınabilir”. “amorphie-mobile-login-error-end” : “Akış hatalı bitti. İşlem kesilmeli. message alanından hata mesajı alınabilir”. ## Device Register Süreci: Uygulama ilk açılışında gerçekleştirilecektir. POST https://test-pubagw6.burgan.com.tr/ebanking/user/device/save ```bash= Request { "deviceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", (cihaz kimlik bilgisi, IMEI veya benzeri bir kimlik olabilir) "installationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", (uygulamanın belirli bir cihaza kurulduğunu tanımlar. Her kurulumda benzersiz bir tanımlayıcı sağlanır) "deviceToken": "string", (Bildirim göndermek ya da cihaz ile özel bir iletişim sağlamak için kullanılan kimliktir.) "deviceModel": "string", (Cihazın model bilgisidir.) "devicePlatform": "string" (Cihazın çalıştığı işletim sistemini veya platformunu ifade eder. Örneğin Android, iOS, Windows, Linux gibi) } Response : 200 OK ``` ## Logout Süreci: İlgili client için token revoke yapmak için aşağıdaki endpoint kullanılmaktadır. PUT https://pubagw6.burgan.com.tr/ebank/token/Revoke/{ClientId}/{Reference} ClientId:Client id Reference:Kullanıcı tckn gönderimi yapılarak client özelinde oluşturulan token'lar revoke edilmektedir. ## Ekran Entity Dataları: ```json= Login Entity : { "username":"Ekrandaki kullanıcı adı", "password" : "Ekrandaki şifre", "client_id" : "Daha önce tarafımızca sağlanmış client Id", "client_secret" : "Daha önce tarafımızca sağlanmış client Secret", "scopes" :"['retail-customer','openId']", "grant_type":"password", } Otp Entity: { "otpValue":"Ekrandan girilmiş değer" } Reset Password Entity: { "newPassword":"Ekrandan girilmiş değer" } Security Image Entity: { "imageId":"Ekrandan seçilmiş resim id" } Security Question Entity: { "questionId":"Ekrandan seçilmiş soru id", "answer":"Ekrandan girilmiş gizli soru cevabı" } ``` ## Hata kodları Hubdan errorCode alanı içerisinde gelen hata kodlarıdır. **453 :** 5 kere yanlış şifre girişi yapıldığı anlamına gelir. **454 :** Son 5 şifre ile aynı şifre girilemez hatası ## Login flow akış diyagramı ```plantuml @startuml start :amorphie-mobile-login (state); if (Kullanıcı bilgisi disabled?) then (yes) :amorphie-mobile-login-disabled-user (state); stop else (no) endif while (Hatalı şifre?) is (yes) :amorphie-mobile-login-wrong-password (state); if (5 kere hatalı?) then (yes) :amorphie-mobile-login-disabled-user (state); stop else (no) endif endwhile (no) if (SecondFactorRequired?) then (yes) :amorphie-mobile-login-otp-flow (state); :amorphie-mobile-login-otp-flow (transition); while ("180 sn sonunda" veya "kullanıcı tekrar gönderilmesini ister" veya "yanlış OTP"?) is (yes) if ("180 sn sonunda" veya "kullanıcı tekrar gönderilmesini ister") then (yes) :amorphie-mobile-login-resend-otp (transition); else (no) endif if (Yanlış OTP?) then (yes) :amorphie-login-send-otp (transition); if (5 kere yanlış OTP?) then (yes) stop else (no) endif endif endwhile (no) else (no) endif if (Şifre değiştirilmesi gerekiyor mu?) then (yes) :amorphie-mobile-login-set-new-password (state); while (Aynı şifre?) is (yes) :amorphie-mobile-login-same-password (transition); endwhile (no) else (no) endif if (Yeni security image?) then (yes) :amorphie-mobile-login-set-new-security-image (state); else (no) endif if (Yeni security question?) then (yes) :amorphie-mobile-login-set-new-security-question (state); else (no) endif if (Onaylaması gereken belge var mı?) then (yes) :amorphie-mobile-login-approve-documents (state); while (Belge onayı var mı?) is (yes) :Belge onayı : amorphie-mobile-login-approve-documents (transition); endwhile (no) else (no) endif :amorphie-mobile-login-end (state); stop @enduml ``` ## Login flow süreç adımları 1. **Başlangıç - amorphie-mobile-login (State):** - Kullanıcı, giriş sayfasında bilgilerini girer ve bu, sürecin başlangıcıdır. Kullanıcı adı ve şifre gibi giriş bilgileri alınır. - Süreç, kullanıcının bilgilerine göre farklı yollara ayrılır. Eğer tüm kontroller başarıyla geçilirse, doğrudan son adıma geçilir. 2. **Disabled Kullanıcı Kontrolü - amorphie-mobile-login-disabled-user (State):** - Bu adımda, eğer kullanıcının hesabı **disabled** (devre dışı) ise, süreç burada sonlanır. Kullanıcı bu durumda giriş yapamaz. 3. **Hatalı Şifre Kontrolü - amorphie-mobile-login-wrong-password (State):** - Kullanıcı yanlış bir şifre girerse, bu duruma geçilir ve kullanıcıya bir uyarı verilir. - **5 Kez Hatalı Şifre:** Eğer kullanıcı 5 kez yanlış şifre girerse, hesabı güvenlik nedeniyle disabled durumuna geçer ve süreç **amorphie-mobile-login-disabled-user (State)** ile sonlanır. 4. **İkinci Faktör Doğrulama (2FA) - amorphie-mobile-login-otp-flow (State & Transition):** - Bu adım, kullanıcı bilgilerinde "SecondFactorRequired" varsa etkinleştirilir. - Kullanıcıya OTP (tek kullanımlık şifre) gönderilir ve OTP sayfasına yönlendirilir. - **amorphie-mobile-login-otp-flow (Transition):** OTP bilgisi kullanıcıya iletilir. - **Yeniden OTP Gönderme İsteği:** Kullanıcı, 180 saniye beklemeden yeniden OTP gönderme isteği yapabilir. Bu durumda, **amorphie-mobile-login-resend-otp (Transition)** ile OTP tekrar gönderilir ve kullanıcı OTP sayfasına yönlendirilir. - **180 Saniye veya Yanlış OTP Kontrolü:** Eğer 180 saniye geçerse veya kullanıcı yanlış OTP girerse, aynı işlem tekrarlanır. - **5 Hatalı OTP Girişi:** Eğer kullanıcı 5 kez yanlış OTP girerse, süreç durdurulur ve başa dönülür. 5. **Şifre Değiştirme İsteği - amorphie-mobile-login-set-new-password (State & Transition):** - Bu adım, kullanıcının şifresini değiştirmesi gerektiğinde çalışır. - Kullanıcı, şifre değiştirme sayfasına yönlendirilir. - **Aynı Şifre Kontrolü:** Eğer kullanıcı aynı şifreyi tekrar girerse, **amorphie-mobile-login-same-password (Transition)** ile bilgilendirilir. 6. **Güvenlik İmajı Güncellemesi - amorphie-mobile-login-set-new-security-image (State & Transition):** - Kullanıcının yeni bir güvenlik imajı belirlemesi veya güncellemesi gerekiyorsa bu adıma geçilir. 7. **Güvenlik Sorusu Güncellemesi - amorphie-mobile-login-set-new-security-question (State & Transition):** - Kullanıcının güvenlik sorusunu belirlemesi veya güncellemesi gerektiğinde bu adıma geçilir. 8. **Sözleşme Onayı - amorphie-mobile-login-approve-documents (State & Transition):** - Kullanıcının onaylaması gereken belgeler varsa, bu adıma geçilir. Kullanıcı, belgeleri inceleyip onaylar. 9. **Süreç Sonu - amorphie-mobile-login-end (State):** - Tüm adımlar ve kontroller başarıyla tamamlandığında, süreç bu son duruma ulaşır ve tamamlanmış olur.