# 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.