# User
Kurum ile temasta olan işlem yapması beklenen tüm kullanıcıları içermektedir.
* Potansiyel müşteriler
* Müşteriler
* Çalışanlar
* Kurumsal müşteri temsilcileri
* İş ortaklarının temsilcileri
Kullanıcı kaydı API üzerinden sistemler tarafından yapılabilirlen, kurumlar tarafından davet usulü ile de yapılabilir.
Statü yönetiminde Açık Bankacılık ile birlikte banka içerisinde bulunan statüler dikkate alınarak dinamik bir statü/iş akışı yaklaşımı güdülür.
## Örnek Veri
| id | Firstname | Lastname | Reference | Tags | State |
| ----- | --------- | -------- | ----------- | ----------------------- | ------ |
| Selda | Selda | Melda | 58562768098 | loan-partner-user | Active |
| Uğur | Uğur | Karataş | 38552069008 | retail-customer, staff | Active |
| Doğan | Doğan | Karataş | 28552069008 | corporate-customer-user | Active |
## Statüler
Kullanıcının bulunabileceği aşamaları tanımlar.
```plantuml
@startuml
participant New
participant "Waiting-Authorization" as WA
participant "Waiting-Registration" as WR
New -> WA : Requested By Flow
WA -> Ready : Authorized By Password Creation Process
New -> WR : Requested By Organization
WR -> Ready : Authorized By Registration Process
Ready -> Active : Service is consumed
Active -> Suspended : (Auto) Pasive for 1 year
Suspended-> Active : Recovered with 3FA
Active -> Suspended : Liveness Check
Suspended-> Active : Validated
Active -> Suspended : Fraud Suspicion
Suspended-> Active : Recovered By Agent
Active -> Suspended : By User
Suspended-> Active : Recovered By User with 3FA
Active -> Suspended : By Organization
Suspended-> Active : Recovered By Organization Admin
@enduml
```
:::warning
Bilgilendirme (Permissions ?) tercihleri, dil tercihleri,iletişim bilgileri yönetimi bu kapsamda değerlendirilebilir mi ?
:::
### FirstName & LastName Source
User kayıtlarının Isim ve soyisim bilgisinin edinileceği Tag belirteçleri sırasıyla tanımlanır. Bir kayıt birden fazla **Tag** içeriyorsa, order parametresine göre öncelikli Tag verisi Title içerisine atanır.
```jsonld!
{[{
"field": "firstname",
"source": [
{
"order": 1,
"tag": "burgan-bank",
"data": "response.data.bank-name"
},
{
"order": 2,
"tag": "corporate-customer",
"data": "response.data.name"
},
{
"order": 3,
"tag": "retail-customer",
"data": "response.data.fullname"
},
{
"order": 4,
"tag": "loan-partner",
"data": "response.data.name"
}
]}
]}
```
```plantuml
@startuml
participant Active [
=Active
----
""Active""
]
participant Liveness [
=Liveness Check
----
""Pasive""
]
participant Fraud [
=Fraud Control
----
""Pasive""
]
participant Pasive [
=Pasive
----
""Pasive""
]
participant Lock [
=Lock
----
""Pasive""
]
Active -> Pasive: Deactivated By User
Active -> Fraud: Fraud
Active -> Liveness: Liveness Check Required
Active -> Lock: Locked while Auth
Fraud -> Active : Recovered
Liveness -> Active : Control Completed
Lock -> Active : Unlocked By User
Lock -> Active : Unlocked By Operator
@enduml
```
| Amorphie Grant Type | OAuth2 GrantType |
| ------------------- | ---------------------------------------- |
| password | password |
| pin | io.amorphie.identity.oauth2.grant.pin |
| puk | io.amorphie.identity.oauth2.grant.puk |
| mobile | io.amorphie.identity.oauth2.grant.mobile |
| web | io.amorphie.identity.oauth2.grant.web |
## Login süreci
```plantuml
@startuml
title Kullanıcı Login Süreci
start
:Logon kontrolü yapılır;
if (Logon mu?) then (Hayır)
:Login süreci başlatılır;
else (Evet)
:Login sürecine girmez;
stop
endif
:GET /user ile amorphie.user kontrolü (İlk etapta her seferinde IB den kullanıcı çekilecek);
if (Kullanıcı var mı?) then (Hayır)
:migrateUser çalışır;
:DodgeIbBusiness veritabanından kullanıcı bilgileri çekilir;
note right
User için firstname, lastname, email, tel
gibi alanlar Dodge veritabanında bulunmuyor.
Bu alanları Tag mikroservis kullanarak
zenginleştirme ile Pusula’dan çekebiliriz.
Encrypt PBKDF2 ile yapılmıştır.
Decrypt için çekilmesi zorunlu alanlar
HashedPassword ve Id’dir.
end note
:Toplanan ve zenginleştirilen datalar amorphie.user’a aktarılır;
else (Evet)
endif
label PasswordSecurityCheck
:amorphie.user üzerinden password security algoritması kontrolü;
if (IsArgonHash = true) then (Hayır)
:PbkdfPasswordHelper. VerifyHashedPassword metodu kullanılır;
else (Evet)
:ArgonPasswordHelper. VerifyHash metodu kullanılır;
endif
if (Eşleşme doğru mu?) then (Evet)
:Kullanıcı için ilgili login flow devam eder;
:Kullanıcı token alır (Access, refresh, identity);
stop
else (Hayır)
:Login başarısız;
stop
endif
@enduml
```
<br><br>
**1. Logon Kontrolü**
* Sistemde aktif bir oturumun olup olmadığı kontrol edilir.
* Aktif bir oturumun olmaması durumunda, login süreci başlatılır.
**2. Kullanıcı Kontrolü**
* GET /user endpoint'i ile amorphie.user içerisinde ilgili kullanıcının varlığı kontrol edilir.
**3. User migration süreci**
* amorphie.user içerisinde kullanıcının olmaması durumunda:
• migrateUser Worker'ı çalıştırılır.
• DodgeIbBusiness veritabanından referans bilgileri kullanarak kullanıcının bilgileri alınır.
• Not: Dodge veritabanında firstname, lastname, email, tel gibi bilgiler bulunmaz. Bu bilgiler Tag mikroservisi aracılığıyla Pusuladan alınır.
• Şifreleme PBKDF2 ile gerçekleştirilmiştir. Şifrenin çözülmesi için DodgeIbBusiness veri tabanındaki Password tablosunda yer alan HashedPassword ve Id bilgilerine ihtiyaç duyulur.
• Toplanan ve zenginleştirilen bilgiler amorphie.user içerisine aktarılır. Bu işlem sırasında User ve Password tablolarına veri ekleme işlemi gerçekleştirilir.
* Kullanıcının zaten var olması durumunda, 4. adıma geçilir.
**4. Password Security Algoritması Kontrolü**
* amorphie.user içerisinde kullanılan şifreleme algoritmasının ne olduğu belirtilmiştir.
* Password tablosundaki IsArgonHash alanı kontrol edilerek kullanılan algoritma saptanır.
**5. Decrypt İşlemi**
* Şifreleme algoritmasının PBKDF2 olması durumunda:
• PbkdfPasswordHelper.VerifyHashedPassword metodu ile şifre çözülür.
* Şifreleme algoritmasının Argon2 olması durumunda:
• ArgonPasswordHelper.VerifyHash metodu ile şifre çözülür.
**6. Login Onayı**
* Şifrenin doğru çözülüp çözülmediği kontrol edilir.
* Şifrenin doğru çözülmesi durumunda:
• Kullanıcı için ilgili login süreci devam ettirilir ve kullanıcıya Access, refresh ve identity token'ları verilir.
* Şifrenin yanlış çözülmesi durumunda:
• Login işlemi başarısız olarak sonlandırılır ve kullanıcıya uygun bir hata mesajı gösterilir.
## Mevcut User Login süreci
```plantuml
@startuml
start
:Logon var mı kontrol edilir;
if (logon == null) then (yes)
:return;
stop
else (no)
:Kullanıcı kilitli olsa da debit cardla callcenter dan giriş yapabilisin;
endif
:UserName(tc,Vkn) bilgisine göre müşteri bilgileri alınır;
if (customerInformation == null) then (yes)
:Geçersiz kullanıcı adı/şifre hatası;
stop
else (no)
:ValidateCustomerCanLogin kontrolü;
if (canLogin == false) then (yes)
:return;
stop
else (no)
:Eğer vkn ile girmeye çalışıyorsa Tc ye dönüştür;
endif
endif
:FindUserByNameAsync ile user bilgileri alınır;
if (user == null || user.EnrollmentDate == null) then (yes)
if (logon.IsCallCenterChannel == false) then (yes)
:LogonFailed: FirstFactorUserNotFound;
stop
else (no)
:create user for call center channel;
endif
else (no)
:User status kontrolü;
if (userStatus == Locked && !isDebitCardLogin) then (yes)
:LogonFailed: FirstFactorUserLocked;
stop
else (no)
:DebitCardLogin kontrolü;
if (isDebitCardLogin) then (yes)
:verifyCardPassword;
if (isVerified) then (yes)
:LogonResult: FirstFactorDebitCardSucess;
else (no)
:LogonResult: FirstFactorDebitCardFailure;
endif
else (no)
:Password & Captcha kontrolü;
if (isVerified) then (yes)
:FirstFactorSuccess;
else (no)
if (shouldLockOut) then (yes)
:LogonFailed: FirstFactorUserLocked;
stop
else (no)
if (logon.IsCallCenterChannel) then (yes)
:LogonFailed: FirstFactorInvalidUserNameAndPassword;
stop
else (no)
:Geçersiz kullanıcı adı/şifre hatası;
stop
endif
endif
endif
endif
endif
endif
stop
@enduml
```
## Mevcut İnternet Bankacılığı User kayıt süreci
```plantuml
@startuml
|Müşteri|
start
:Hesap açtırır;
if (Müşteri internet bankacılığı kullanmak istiyor mu?) then (evet)
|Şube Çalışanı|
:Bir ticket oluşturur;
|Backoffice|
if (Talep onaylandı mı?) then (evet)
:İnternet bankacılığı hesabı oluşturulur;
:<color:red>Burada Amorphie user kaydı yapılmalı</color>;
:Müşteriye SMS ile bilgilendirme yapılır;
else (hayır)
|Backoffice|
:Talep iptal edilir;
stop
endif
else (hayır)
|Müşteri|
endif
stop
@enduml
```
<br><br>
**Kayıt süreci :**
Bu süreç, bir müşterinin internet bankacılığı hizmetini kullanmak istemesi durumunda izlenen yol haritasını göstermektedir. Bir müşterinin öncelikle banka hesabı açtırmasıyla başlar. Müşteri, internet bankacılığı hizmetini kullanmak isteyip istemediği sorulduktan sonra, eğer istiyorsa banka şubesinde bir ticket oluşturulur. Mevcut shell ekranlarından ticket onayı gerçekleştirilir. Eğer onaylandıysa, internet bankacılığı hesabı oluşturulur ve Amorphie kullanıcı kaydı yapılır. Daha sonra, müşteriye SMS yoluyla bilgilendirme yapılır ve süreç tamamlanır. Ancak, talep onaylanmadıysa, talep iptal edilir ve süreç sona erer.
## Login süreci workflow
Login süreci workflow uygulamamız üzerinden başlatılmaktadır.
**1. Adım :**
POST https://pubagw6.burgan.com.tr/ebank/flow/consumer/login/record/{recordid}/transition servisi login sürecini başlatmak için kullanılır.
Headers değeri olarak User ve Behalf-Of-User değerinin girilmesi gerekmektedir
```json=
Request
{
"entityData":
{"client_id":"client id değeri","client_secret":"client secret değeri","grant_type":"password","password":"password değeri","scopes":["retail-customer","openId"],"username":"tckn değeri"}
,
"formData": "",
"additionalData": "",
"getSignalRHub": true,
"routeData": "",
"queryData": ""
}
Response :
{
"result": {
"status": "Success",
"message": "Instance Has been Created",
"messageDetail": ""
},
"data": null
}
```
**2. Adım**
1. Adımdaki istek sonrasında hubdan gelen değer beklenir.
https://pubagw6.burgan.com.tr/ebank/flow/hub/hubs/workflow
MethodName=>SendMessage
Hubdan eventinfo olarak "worker-completed" mesajı geldikten sonra hubdan belirtilen ilgili sayfaya yönlendirme yapılır.
## Login 2FA OTP süreci:
```json=
curl -X POST \
'https://pubagw6.burgan.com.tr/ebank/flow/consumer/login/record/e6af0a4c-29b9-4110-8e50-2cc9b3ae27c1/transition/start-password-flow-web' \
--header 'Accept: */*' \
--header 'User: 65318956-a86f-4cf0-b474-bbb4f67a39d6' \
--header 'Behalf-Of-User: 3845dc3f-7c44-4a96-9d5e-9cbd331f0a9c' \
--header 'Content-Type: application/json' \
--data-raw '{
"entityData":
{"client_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","client_secret":"sercan","grant_type":"password","password":"sercan","scopes":["retail-customer","openId"],"username":"19985693572"}
,
"formData": "",
"additionalData": "",
"getSignalRHub": true,
"routeData": "",
"queryData": ""
}'
Response
{
"result": {
"status": "Success",
"message": "Instance Has been Created",
"messageDetail": ""
},
"data": null
}
```
istek sonrasında hubdan gelen değer beklenir.
https://pubagw6.burgan.com.tr/ebank/flow/hub/hubs/workflow
MethodName=>SendMessage
Hubdan eventinfo olarak "worker-completed" mesajı geldikten sonra hubdan belirtilen ilgili sayfaya yönlendirme yapılır
Yukarıdaki istek için gelen Hub mesajı
{\"UserId\":\"65318956-a86f-4cf0-b474-bbb4f67a39d6\",\"recordId\":\"e6af0a4c-29b9-4110-8e50-2cc9b3ae27c1\",\"eventInfo\":\"**worker-completed**\",\"instanceId\":\"84a64dd3-4421-4603-981a-9c7bb1e028a6\",\"entityName\":\"login\",\"data\":{\"client_id\":\"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\"client_secret\":\"sercan\",\"grant_type\":\"password\",\"password\":\"sercan\",\"scopes\":[\"retail-customer\",\"openId\"],\"username\":\"19985693572\"},\"time\":\"2023-12-05T12:35:14.9130184Z\",\"state\":\"token-otp\",\"transition\":\"start-password-flow-web\",\"baseStatus\":4,\"page\":{\"operation\":\"Open\",\"type\":\"Popup\",\"pageRoute\":{\"language\":\"en-EN\",\"label\":\"**Login_Otp**\"},\"timeout\":3000},\"message\":\"\",\"additionalData\":{},\"workflowName\":\"login\"}"
Gelen mesaj içerisinde login_otp sayfasına yönleneceğimizi anlıyoruz.
Login otp sayfasını açtırdığınızda hangi transition'dan devam edeceğimizi aşağıdaki endpointten sorgulayarak görebiliyoruz.
```json=
curl -X GET \
'https://pubagw6.burgan.com.tr/ebank/flow/consumer/login/record/e6af0a4c-29b9-4110-8e50-2cc9b3ae27c1/transition' \
--header 'Accept-Language: en-EN'
Response
{
"result": {
"status": "Success",
"message": "Success",
"messageDetail": ""
},
"data": {
"stateManager": {
"status": "token-otp",
"name": "login",
"title": "login Workflow",
"transitions": [
{
"name": "send-push-login-flow",
"title": "Send Push ",
"form": "",
"type": "Formio"
}
],
"publicForm": {
"type": "padding",
"args": {
"padding": {
"left": 32,
"right": 32
},
"child": {
"type": "column",
"args": {
"children": [
{
"type": "otp_title_widget",
"args": {
"title": "Şifre Doğrulama"
}
},
{
"type": "otp_message_widget",
"args": {
"message": "Lütfen 5** ** 45 ile biten cep telefonunuza gelen doğrulama kodunu giriniz."
}
},
{
"type": "otp_count_down_timer_widget",
"args": {
"duration": 120
}
},
{
"type": "otp_input_with_submit_button_widget",
"args": {
"title": "SMS Doğrulama Kodu",
"buttonText": "Devam",
"otpLength": 6,
"workflow": "login",
"transitionId": "send-push-login-flow"
}
},
{
"type": "spacer"
},
{
"type": "security_icon_widget",
"args": {
"paddingAll": 32
}
}
]
}
}
}
},
"isPublicForm": true
},
"runningWorkflows": [],
"availableWorkflows": []
}
}
```
Yukarıdaki istekte gelen transition name'e (send-push-login-flow) göre aynı recordid ile süreci devam ettiriyoruz.
Bu transition için aşağıdaki gibi süreci devam ettiriyoruz. (Otp adımında SMS ya da Push ile aldığımız OTP'yi entityData içerisinde gönderiyoruz)
```json=
curl -X POST \
'https://pubagw6.burgan.com.tr/ebank/flow/consumer/login/record/e6af0a4c-29b9-4110-8e50-2cc9b3ae27c1/transition/send-push-login-flow' \
--header 'Accept: */*' \
--header 'User: 65318956-a86f-4cf0-b474-bbb4f67a39d6' \
--header 'Behalf-Of-User: 3845dc3f-7c44-4a96-9d5e-9cbd331f0a9c' \
--header 'Content-Type: application/json' \
--data-raw '{
"entityData":
{"otp_Value":"123456"}
,
"formData": "",
"additionalData": "",
"getSignalRHub": true,
"routeData": "",
"queryData": ""
}'
```
Hub'dan tekrar mesaj beklenir. Home sayfası geldiğinde ana sayfaya yönlendirilir. Burada sürece eklenen her adım workflow transition'lara dahil edilebilir. İstenirse farklı sayfalara yönlendirme yapılabilir.
istek sonrasında hubdan gelen değer beklenir.
https://pubagw6.burgan.com.tr/ebank/flow/hub/hubs/workflow
MethodName=>SendMessage
Yukarıdaki istek için gelen Hub mesajı
"{\"UserId\":\"65318956-a86f-4cf0-b474-bbb4f67a39d6\",\"recordId\":\"e6af0a4c-29b9-4110-8e50-2cc9b3ae27c1\",\"eventInfo\":\"worker-completed\",\"instanceId\":\"84a64dd3-4421-4603-981a-9c7bb1e028a6\",\"entityName\":\"login\",\"data\":{\"otpValue\":\"779321\"},\"time\":\"2023-12-05T12:35:14.9130184Z\",\"state\":\"login-succeded\",\"transition\":\"send-push-login-flow\",\"baseStatus\":4,\"page\":{\"operation\":\"Open\",\"type\":\"Page\",\"pageRoute\":{\"language\":\"en-EN\",\"label\":\"Home\"},\"timeout\":3000},\"message\":\"\",\"additionalData\":{\"**access_token**\":\"eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6InJldGFpbC1jdXN0b21lciIsInVzZXIucmVmZXJlbmNlIjoiNDQ0NDQ0NDQ0NDQiLCJqdGkiOiJkZTE3M2M4YS0yY2FkLTQ3NGEtOGEzOC0xZTE0ODJkYTI2ZTIiLCJ1c2VySWQiOiIwM2Y3ODQ0MC1iMTgzLTFkYWUtYTEyYy1lYjRkODlkMDYyMjUiLCJleHAiOjE3MDE3ODU4NTIsImlzcyI6IkJ1cmdhbklhbSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTEyNC9BdXRoZW50aWNhdGVkVjIifQ.QDYl68Gs8U2DQVZJQqXNX724diiRR0LAPAPRHNQXIFOYhXgE1A1wnx6d87xuxSsB\",\"expires_in\":300,\"id_token\":\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpYXQiOjE3MDE3ODU1NTIsInVzZXIucmVmZXJlbmNlIjoiNDQ0NDQ0NDQ0NDQiLCJ1c2VyLmlkIjoiMDNmNzg0NDAtYjE4My0xZGFlLWExMmMtZWI0ZDg5ZDA2MjI1IiwiZXhwIjoxNzAxNzg1ODUyLCJpc3MiOiJCdXJnYW5JYW0iLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjUxMjQvQXV0aGVudGljYXRlZFYyIn0.\",\"**refresh_token**\":\"eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmM2Q0YmYxZS00NDJjLTQ0OWMtOTcxNy0zZWQ0NmNlMDFlNmYiLCJ1c2VySWQiOiIwM2Y3ODQ0MC1iMTgzLTFkYWUtYTEyYy1lYjRkODlkMDYyMjUiLCJleHAiOjE3MDE4NDE1NTIsImlzcyI6IkJ1cmdhbklhbSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTEyNC9BdXRoZW50aWNhdGVkVjIifQ.h35WIub7fkxH_S_3Tfw7E2caYzJn3mILCJQ1bag4V-WX-HovaNZOJOPra7eRGFpJ\",\"refresh_token_expires_in\":56000,\"token_type\":\"Bearer\"},\"workflowName\":\"login\"}"
Otp sonrasında access token ve refresh token additionalData içerisinde gelmektedir.
**Logout için token uygulamamızdaki rewoke metodunu kullanıyoruz**
https://test-amorphie-token.burgan.com.tr/private/Revoke/19985693572