Authentication & Authorization in Web Application

Pan Chuan

2016.12.08

Why do this talk?

  • summarize the fragmental Authorization & Authentication knowledge which got during Goauth project.

Outline

  • Web Authorization VS Authentication
  • Web Authentication Main Methods
  • GoAuth brief introduction

- HTTP Basic Auth

- HTTP Digest Auth

- Cookie-based Auth 

- Token-based Auth ( JWT )

- OAuth2

Authentication answer the questions:

  •  who is the user ?
  •  Is the user really who himself claims ?

Authorization answer the questions:

  •  Is User X authorized to access resource R ?
  •  is User X authorized to perform operation P ?
  •  Is User X authorized to perform operation P on resource R ?

Concept Clarify

Contrast

Authentication

Authorization

Enter a building with badge/fingerprint/retina scan

Login into a forum with username and password

allow to enter a door

Edit yourself's thread

Edit other people's thread

HTTP Status Code 401 vs 403

  • Related to authentication 
  • No credential or wrong credentail 
  • Semantically "unauthenticated" should be more accurate
  • Related to authorization
  • The server understands the request, but refuse to fulfill it.

401 Unauthorized:

403 Forbidden:

Tips about A&A

 

  • Authentication always proceeds Authorization. 

 

  • We have paradigm for Authenentication, but no common rules for Authorization. Authorization highly depends on your business logic.

 

  • Both unproper Authentication and Authorization can bring severe security issues to your Application.

Real Example: Authorization  Vulnerability in Rakuten Books

https://books.rakuten.co.jp/mypage/delivery/receiptPrint?order_number=213310-20160914-0910455279&back_number=2f4c0b5b26845f788d71377383113a26efdd61b68fd5595771663b066a35a02c&shippingId=82719971&customerName=Pan%E3%80%80Chuan​

82719981 can work.

receipt page url:

receipt page pdf:

You have access to see everyone's receipt..

  • NEVRE trust the request from client.

  • ALWAYS check the real authorization after the authentication pass.

Keep In Mind

Stateless REST APIs

Client

DELETE http://myapis.com/v1/res/456

userid="111"

Need check again if userid '111' can really delete resource  456 by querying DB/ACL.

123

789

Http Basic Authentication

 

GET /someresource/ HTTP/1.1
Host: www.hostname.com
Authorization: Basic aHR0cHdhdGNoOmY=

Base64(<username>:<password>)

  • The simplest technique for enforcing access control to web resources.
  • Use standard field in the HTTP header, avoid cookies, session identifiers or login page
  • Super simple but not secure, always use HTTPs for HTTP basic auth

Http Digest Authentication

 

  • Secure version of http basic auth.
  • Don't send password plaintext, send username and MD5 hash 

client

server

init request

401 return, nonce

send[ username,nonce,MD5(nonce,username,URI,Method,password)]

200

1) look up password from DB

2) re-compute MD5 and compare

real Http Digest is more complex than this simple version diagram, please check the wikipedia

cookie-based Authentication 

cookie-based Authentication 

  • Cookie-based Auth is stateful.

  • Backend servers need to share/sync all sessions if multiple service instance are running.

  • The server needs to keep track of active sessions in a storage(Framework context/DB/Redis).

Token-based Authentication 

  • Token-based authentication has gained prevalence over the last few years due to rise of single page applications, web APIs, Mobile Apps and the Internet of Things(IoT).
  • Token-based authentication works by ensuring that each request to a server is accompanied by a signed token which the server verifies for authentication and only then resonds to the request.

Token-based Authentication 

Same Step 1 as Cookied-based

Token-based Authentication 

Mechanism

token = user_id |  expiry_date | HMAC (user_id | expiry_date, secret)
  • Using a hash mechanism e.g HMAC-SHA1
  • Encrypting the token symmetrically e.g AES
token = AES(user_id | expiry_date, key)
  • Encrypting the token asymmetrically e.g RSA
token = RSA(user_id | expiry_date, private_key)

Introducing JWT

  • Json Web Token is a open stardard (RFC7519) for creating access tokens that assert some number of claims. The claims are encoded as a JSON object that is digitally signed by hashing it using a secret that only know by server.

 

  • A secure way to encapsulate arbitrary data that can be sent over unsecure http connection.

 

  • While there are different ways to implement tokens, JWT has become the de-facto stardard.

JWT string

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

{
"typ": "JWT",
"alg": "HS256"
}
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Header Json:

Payload Json:

Signature: HMACSHS256(base64(header) + "." + base64(payload),"secret")

Payload: base64(payload)

Header: base64(header Json)

  • JWT Token is signed,not encrypted.

JWT diagram

JWT benefits

  • Stateless, Scalable and Decoupled
  • Performance
  • Cross Domain and CORS
  • Mobile Ready

- backend does not need to track tokens, each token is self-contained

- save sessions' storage

- decoding jwt is faster than lookup DB/Cache for session query.

- Native mobile platforms doest mix well with cookie,

- cross domain headache is gone.

What else can JWT be useful?

  • To archieve Single Sign-on.

- Sharing the Jwt between different applications.

  • Whenever you need to securely send a payload.

  • Generate "one click" action url link.

- Eg: to obscure URL parameters or POST body.

 JWT one-click example

  • Scenario:A followed B, Website nofitys B by Email and provide a link to let B also follow A

https://your.awesome-app.com/make-friend/?from_user=B&target_user=A

https://your.awesome-app.com/make-friend/?jwt=aaa.bbb.ccc

{

   “expire”:1441594772,

   "sub": "B@example.com",

   "aud": "www.example.com",

   "from_user":"B",

   "target_user":"A"

}

jwt payload part:

Not Good,

Need login first

Good,

One Click

Best practice about JWT 

  • Keep the Key secret.
  • Don't add senstive data to the payload.
  • Give token an expiration.
  • Embrace HTTPS.

the jwt token is valid forever unless the signing key is changed or expration explicitly set.

payload text is just base64 encoded.

the signing key should be treated like any other credentials and revealed only to services that absolutely need it.

Recap 4 Authentication Methods

  • HTTP Basic Auth

- simple but not secure

  • HTTP Digest Auth

- secure but usage is limited

  • HTTP Cookie-based Auth

- flexible/powerful but resource cost

  • HTTP Token-based Auth

- balanced and widely scenario support

OAuth2 Introduction

  • The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf.

OAuth2: Roles

Resource Owner: the person or the application that holds the data to be shared.

Resource Server: the application that holds the protected resources.

Authorization Server: the application that verifies the identity of the users.

Client: the application that makes request to the Resource Server on behalf of the Resource Owner.

OAuth2: workflow

rfc 6749:

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

I want to see a list of photoes

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Hi, RS, could you give me a list of photoes?

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Sorry, this is a protected resource, You

need an access token.

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Hi AS, can I get an access

token? RS is asking.

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Sure, But I need to ask some

details to the user first.

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Hi, Could you provide your credentials?

I need to verify your identity

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

No problem, I am snow@gmail.com and my

password is secret

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

The user is who claims to be,

Here is your access token: yGH38dee0oHN72Dyen3

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Hi Backend,

Here is my token: yGH38dee0oHN72Dyen3

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Hi I have been give token: yGH38dee0oHN72Dyen3

can you tell me who it belongs to?

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Of course, the token is valid and it belongs to:

snow@gmail.com

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Everything is allright, This is the

list of photoes,enjoy!

OAuth2: Example

Resource Owner

Authorization Server

Resource Server

Client

Here you are the list of photoes, enjoy!

Resource Owner

Client

OAuth2 works as a delegation way, as the Client has no idea about the credentials of the Resouce Owner

OAuth vs JWT

  • They are totally different things, not comparable.

  • JWT is a type of token, OAuth is a framework that describes how to dispense tokens. Apple VS Apple Carts !

  • JWT can absolutely be used as an OAuth bearer token. (the most common practice RFC7523)

GoAuth introduction

  • GoAuth provides an independent authentication layer between multiple services. It can also return some simple metadata for authorization usage to the caller.
  • GoAuth's main task is doing authentication, helps to do authorization for avocation.

GoAuth workflow

OrderAPI

 

ItemAPI

 

ShopAPI

 

 

GoAuth

 

rmsX microservices:

Some Client

1.apply key

2.request with key

3.validate key

GoAuth Authentication

  • Weak Validation Type: (similar with HTTP Basic Auth )
  • Strong Validation Type: (similar with HTTP Digest Auth)
Authorization: serviceId Key:Signature
Date: 2016-12-11T15:03:24Z

Requst Header:

Requst Header:

Authorization: serviceId Key

Signature = Base64(HAMC-SHA1(APISecret, StringToSign))

StringToSign = Date + " \t" + ReqURI + "\t"+ ReqMethod

GoAuth Authorization

  • Goauth Validation API can return Key's metadata to caller to help doing high-level authorization.
  • Each key's Metadata is pre-defined by service admin via Goauth back-stage system.
{
    "StatusCode": 200,
    "Message": "Validate successfully.",
    "Metadata": {
        "RoleName":"General Engineer",
        "UserName":"chuan.pan@rakuten.com",
        "ResourcePermission":[
            {"Resource":"order/find", "Methods":["GET"]},
            {"Resource":"order/get", "Methods":["GET"]},
            {"Resource":"order-detail/add", "Methods":["POST"]},
        ]
    }
}

Summary

  • Authentication vs Authorization
  • Authentication methods

- Http Basic Authentication

- Http Digest Authentication

- Cookie-based VS Token-based Authentication

  • GoAuth project introduction

- Oauth2 VS Jwt

Thanks

Q&A

A&A

By panchuan

A&A

  • 1,027