## Flutter Web OAuth2 Authorization Code Flow Technical Specification **Summary** - This document describes how to obtain access token from Flutter Web View with Authorization Code Flow(PKCE). **Authorization Code Flow Steps** 1. Redirecting Amorphie SSO Authorize Page 2. Getting authorization code and another Query Parameters required to security considerations 3. Checking state,nonce(Security Query Params) etc 4. Exchanging authorization code for access token **Redirecting Amorphie SSO Authorize Page** 1. Before the redirect, parameters below should be generated client side and added to redirect address as a query param <ul> <li> State : parameter is a unique, randomly generated, opaque, and non-guessable string that is sent when starting an authentication request and validated when processing the response </li> <li> Nonce : A random or pseudo-random number that is generated for a specific use, typically for cryptographic communication. The Nonce is used to protect against replay attacks by ensuring that a message or data cannot be reused or retransmitted. </li> <li> PKCE Parameters : Once the app has generated the code verifier(This code will be use on authorization code exchange step), it uses that to derive the code challenge. For devices that can perform a SHA256 hash, the code challenge(will be added to url as a query parameter) is a Base64-URL-encoded string of the SHA256 hash of the code verifier. </li> </ul> - Authorization Redirect request is defined below ```javascript! GET https://{environment}-pubagw6.burgan.com.tr/ebanking/Authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=openid%20profile&code_challenge={generated_code_challange}&code_challenge_method=S256&response_mode=form_post&state={generated_state} ``` - Consider the authorization code has a short lifetime to exchange (60 second) **2. Exchanging authorization code for access token** - Token request is defined below ```json POST https://{environment}-pubagw6.burgan.com.tr/ebanking/token { client_id:"Client Id", client_secret:"Client Secret", grant_type:"authorization_code", code:"{Authorization Code Which Comes From Callback Url Query Params}", "code_verifier":"{Generated_Code_Verifier}" redirect_uri:"{Redirect Uri Sended At First Place}" scope:"openid profile"//Optional } ``` - Success Response ```json! Status Code : 200 { access_token:"{access_token}", refresh_token:"{refresh_token}", id_token:"{id_token}", token_type:"Bearer", expires_in : "300", //Seconds refresh_token_expires_in: "3600" //Seconds } ``` - Error Responses ```json! Status Code : 471 { "status": 471, "detail": "Client Has No Authorize To Use Requested Grant Type", "errorCode": 471 } ``` ```json! Status Code : 472 { "status": 472, "detail": "Client is Not Matched", "errorCode": 472 } ``` - Error Responses ```json! Status Code : 475 { "status": 475, "detail": "Redirect Uri is Not Matched", "errorCode": 475 } ``` - Error Responses ```json! Status Code : 476 { "status": 476, "detail": "Invalid Authorization Code", "errorCode": 476 } ```