Mastering OAuth 2.0 (True North PHP 2016)

0c217b9a7dd0aa31ed40bd0f453727e1?s=47 Ben Ramsey
November 05, 2016

Mastering OAuth 2.0 (True North PHP 2016)

OAuth 2.0 isn't easy, and everyone has a slightly different implementation, making interoperability a nightmare. Fortunately, the PHP League of Extraordinary Packages provides league/oauth2-client. Aiming for simplicity and ease-of-use, league/oauth2-client provides a common way to access providers. This talk introduces OAuth concepts, demonstrates how to perform OAuth flows with league/oauth2-client, and shows how to use league/oauth2-client to build a client library for your own provider.

0c217b9a7dd0aa31ed40bd0f453727e1?s=128

Ben Ramsey

November 05, 2016
Tweet

Transcript

  1. Mastering OAuth 2.0 Ben Ramsey
 True North PHP 5 Nov

    2016
  2. OAuth 2.0

  3. None
  4. None
  5. #1 Click to authorize

  6. #2 Log in on site and grant permission

  7. #3 Redirect back with auth code #4 Exchange code
 for

    access token
  8. #5 Use access token to get data

  9. bram.se/tnphp16-oauth2-app

  10. Preparing for OAuth

  11. 1. Register your application with the service 2. Let the

    service know your domains or
 redirect URLs 3. Configure your application to use the
 client ID and client secret given to you by
 the service ! No two OAuth 2.0 providers are alike!
  12. None
  13. None
  14. None
  15. None
  16. None
  17. Integrating with the Provider

  18. composer require league/oauth2-instagram

  19. use League\OAuth2\Client\Provider\Instagram; $provider = new Instagram([ 'clientId' => 'CLIENT_ID', 'clientSecret'

    => 'CLIENT_SECRET', 'redirectUri' => 'https://example.com/redirect', ]);
  20. Authorization Request 1. Generate authorization URL 2. Store state to

    session 3. Prompt user to authorize or redirect them
  21. $authUrl = $provider->getAuthorizationUrl(); $request->session()->put( 'instagramState', $provider->getState() ); return redirect()->away($authUrl);

  22. Redirection Endpoint 1. Receive authorization code 2. Check state 3.

    Exchange code for an access token
  23. $state = $request->session()->get('instagramState'); if ($request->state !== $state) { abort(400, 'Invalid

    state'); } if (!$request->has('code')) { abort(400, 'Authorization code not available'); } $token = $provider->getAccessToken( 'authorization_code', [ 'code' => $request->code, ] ); $request->session()->put('instagramToken', $token); return redirect()->action('HomeController@index');
  24. Expiring & Refreshing Tokens 1. Check for expiration & refresh

    token 2. Request access token using refresh token
  25. if ($token->hasExpired() && $token->getRefreshToken()) { $newToken = $provider->getAccessToken('refresh_token', [ 'refresh_token'

    => $token->getRefreshToken(), ); } $request->session()->put('accessToken', $token); ! Instagram does not support refresh tokens
  26. Using Access Tokens 1. getAuthenticatedRequest() returns a PSR-7 RequestInterface object

    2. Use your favorite HTTP request library to make a request
  27. $feedRequest = $provider->getAuthenticatedRequest( 'GET', 'https://api.instagram.com/v1/users/self/media/recent', $instagramToken ); $client = new

    \GuzzleHttp\Client(); $feedResponse = $client->send($feedRequest); $instagramFeed = json_decode( $feedResponse->getBody()->getContents() );
  28. A Brief History of Web Authorization

  29. What is OAuth 2.0?

  30. “However, as a rich and highly extensible framework with many

    optional components, on its own, this specification is likely to produce a wide range of non-interoperable implementations.” RFC 6749, Section 1.8
  31. 1. Resource owner 2. Resource server 3. Client 4. Authorization

    server
  32. composer require league/oauth2-client

  33. use League\OAuth2\Client\Provider\GenericProvider; $provider = new GenericProvider([ 'clientId' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'clientSecret'

    => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'redirectUri' => 'https://you.example.com/redirect-url', 'urlAuthorize' => 'https://them.example.net/authorize', 'urlAccessToken' => 'https://them.example.net/token', 'urlResourceOwnerDetails' => 'https://them.example.net/api/me' ]);
  34. Authorization Code 1. Commonly referred to as three-legged 2. Used

    in our Instagram example 3. Very common grant type
  35. Resource Owner Client Auth Server Resource Server

  36. Step 1

  37. Step 2

  38. Step 3

  39. Step 4

  40. 1. Gives username and password to client 2. Client exchanges

    them for access token 3. Use with extreme caution Resource Owner Password Credentials
  41. Resource Owner Client Auth Server Resource Server

  42. Step 1

  43. Step 2

  44. Step 3

  45. $accessToken = $provider->getAccessToken('password', [ 'username' => 'demouser', 'password' => 'testpass'

    ]);
  46. Client Credentials 1. Client is the resource owner 2. Credentials

    are stored in the client (usually safely on the server)
  47. Client Auth Server Resource Server

  48. Step 1

  49. Step 2

  50. $accessToken = $provider->getAccessToken( 'client_credentials' );

  51. Implicit 1. Relies on client-side redirection using a client ID

    and a known redirection URL 2. league/oauth2-client cannot support this
  52. Toward a More Secure Web

  53. THANK YOU. ANY QUESTIONS? If you want to talk more,

    feel free to contact me. benramsey.com @ramsey github.com/ramsey ben@benramsey.com Mastering OAuth 2.0 Copyright © 2016 Ben Ramsey This work is licensed under Creative Commons Attribution-ShareAlike 4.0 International. For uses not covered under this license, please contact the author. Ramsey, Ben. “Mastering OAuth 2.0.” True North PHP. Microsoft Canada, Mississauga. 5 Nov. 2016. Conference presentation. This presentation was created using Keynote. The text is set in Chunk Five, Helvetica Neue, and Marker Felt. The source code is set in Menlo. The iconography is provided by Font Awesome. Unless otherwise noted, all photographs are used by permission under a Creative Commons license. Please refer to the Photo Credits slide for more information. Ŏ joind.in/talk/7a6db
  54. Photo Credits 1. “Untitled” by MICⱵ^ΞL 2. “Master” by Giuditta

    3. “Untitled” by MICⱵ^ΞL 4. “Untitled” by MICⱵ^ΞL 5. “Untitled” by MICⱵ^ΞL 6. “master gain” by Chris Blakeley 7. “Mixing board” by Kevin Jaako 1 2 3 4 5 6 7