# Auth Client Sdk

Reflaunt angular client sdk that is used to perform authentication to reflaunt via cognito with a fallback to legacy token management

## Publishing

After your library is build, go to the dist folder `cd ../../dist/auth-client-sdk` and run `npm publish`.

## Publish locally

- After your library is build, go to the dist folder `cd ../../dist/auth-client-sdk` and run `npm link`.
- In your application project, run `npm @reflaunt/link auth-client-sdk`

## Running unit tests

Run `ng test auth-client-sdk` to execute the unit tests via [Karma](https://karma-runner.github.io).

## Usage

- Imports the `ReflauntAuthModule` in your `AppModule`
- Provide configurations of `COGNITO_CONFIGURATION`, `AUTH_API_CONFIGURATION`, `LEGACY_CONFIGURATION`
```
@NgModule({
   imports: [
     ...
     ReflauntAuthModule
   ],
   declarations: [...],
   providers: [
    {
      provide: COGNITO_CONFIGURATION,
      useValue: {
         userPoolId: 'ap-southeast-1_pool id',
         userPoolWebClientId: 'pool web client id',
         domainPrefix: 'pool domain prefix',
         region: 'ap-southeast-1',
         loginRedirect: 'https://client-local.reflaunt.com/login',
         logoutRedirect: 'https://client-local.reflaunt.com',
         resetPasswordRedirect: 'https://client-local.reflaunt.com/reset-password'
      }
    },
    {
      provide: AUTH_API_CONFIGURATION,
      useValue: {
        apiUrl: 'https://api-local.reflaunt.com'
      }
    },
    {
      provide: LEGACY_CONFIGURATION,
      useValue: {
        tokenKeyName: 'token key'
      }
    }    
   ],
   bootstrap: [AppComponent]
})
export class AppModule {}
```
- ideally in the component we can just import the `public reflauntAuthService: ReflauntAuthService`

## Configuration

### COGNITO_CONFIGURATION
| Key | Description |
| --- |---| 
| userPoolId | cognito user pool id |
| userPoolWebClientId | cognito web client id |
| domainPrefix | cognito auth API domain prefix |
| region | cognito region |
| loginRedirect | where to redirect the page after login by identity provider |
| logoutRedirect | where to redirect the page after logout |
| resetPasswordRedirect | where to redirect the page reset password |

### AUTH_API_CONFIGURATION
| Key | Description |
| --- |---| 
| apiUrl | url of the Reflaunt API |

### LEGACY_CONFIGURATION
| Key | Description |
| --- |---| 
| tokenKeyName | Cookies name where token is going to be stored  |


### Common practices

#### listening for authentication state changes 
```
  constructor(
    private reflauntAuthService: ReflauntAuthService
  ) {
    reflauntAuthService.listenToStateChanges().subscribe((authState: AuthState) => {
      if (authState.shouldLogout) {
        return reflauntAuthService.logout();
      }
      if (authState.isAuthenticated) {
        // fetch login details
      } else {
        if (authState.shouldRedirectToConfirmSignUp && authState.confirmSignUpParams) {
          // redirect to confirm sign up page
        }
      }
    });
  }
```

#### Getting authentication state as observable
```
  constructor(
    private reflauntAuthService: ReflauntAuthService
  ) {
    reflauntAuthService.isAuthenticated()
      .subscribe((authState: AuthState) => {
        // do somehting with authentication state
      }));
  }
```

#### Getting current access token as observable
```
  constructor(
    private reflauntAuthService: ReflauntAuthService
  ) {
    reflauntAuthService.getAccessToken()
      .subscribe((token: string) => {
            // do somehting with access token
      }));
  }
```

#### Current state
Current state can also be get real-timely by using 
```
  constructor(
    private reflauntAuthService: ReflauntAuthService
  ) {
    console.log(reflauntAuthService.authState);
  }
```

#### Get current profile
```
  constructor(
    private reflauntAuthService: ReflauntAuthService
  ) {
    reflauntAuthService.getUserProfile().then(res => {
        console.log(res.data);
        // res will be the raw data from get user profile API of Reflaunt
    });
  }
```
