# Authentication and Authorization with Platform v2
## Onboarding
### Invite a participant to the ecosystem
```flow
st=>start: Create Wallet
e=>end: Send Email Invitation
cond_is_org=>condition: Is Organization?
op_did=>operation: Register DID
op_cap=>operation: Assign Role
- Individual
- Organization
st->cond_is_org
cond_is_org(no)->op_cap
cond_is_org(yes)->op_did
op_did->op_cap->e
```
## Authentication
Relies on a negotiation between the server and client, whereby the server issues a short-lived token that the client will need to submit in each subsequent request to be authenticated. The token is submitted as a header with a pre-defined scheme, e.g. `Bearer <token encoded as base64`
### Authentication: New Registration
```mermaid
sequenceDiagram
autonumber
participant User
participant Client as Client SDK
participant Server
User->>+Client: Create new Wallet
Client->>Client: Generate new DID
Note over Client: DIDKey.generate()
Client->>Client: Store DID in secure storage
Client->>Client: Sign auth request
Note over Client: DIDKey.sign()
Client->>+Server: Send create wallet request
Note over Client,Server: WalletService.CreateWallet()
Server->>Server: Verify signature, extract did:key:alice-1
Server->>Server: Create new peer DID as owner of the wallet
Note right of Server: Generate BLS G1/G2 keys,<br/>Ed25519 and x25519.
Server->>Server: Create new root capability
Note right of Server: id = "urn:trinsic:wallet:alice"<br/>invoker = "did:peer:alice"<br />delegator = "did:peer:alice"
Server->>Server: Create delegated capability
Note right of Server: invoker = did:key:alice-1<br /> capability = urn:trinsic:wallet:alice
Server-->>-Client: Create Wallet Response
Note over Server,Client: Capability = urn:trinsic:wallet:alice<br/>Invoker = did:key:alice-1
Client->>Client: Store Generated Key and Capability as Profile
Client->>-User: Success
```
```proto
message {
google.protobuf.Struct did_document = 1;
string capability = 2; // reference to the wallet Id/capability
string invoker = 3; // the specific key from the did document
}
```
---
### Authentication: Existing Registration
```mermaid
sequenceDiagram
autonumber
participant User
participant Client as Client SDK
participant Server
User->>+Client: Authenticate to Wallet - SetProfile()
Note over User,Client: WalletId = Alice<br/>
Client->>Client: Retrieve Profile from secure storage
Client->>Client: Sign auth request - Capability Ivocation
Note over Client: LdProofs.createProof()
Client-->-User:
User->>Client: Send endpoint request
Client->Client: Append Auth header (Cap Inv)
Client->+Server: Send request
Note over Client,Server: AuthService.AcquireToken()
Server->>Server: Check if DID has capability<br />for requested WalletId
Note over Server: "Authorizations" Collection in CosmosDB
Server-->>-User: Endpoint Response
```
## API Calls
- Attach auth token derived from profile.bin
- Capability invocation document per channel
- Added as metadata to the call
- pack, if secure endpoint
- send