Slide 1

Slide 1 text

1)1ͰֶͿ0"VUIೖ໳ 1)1ΧϯϑΝϨϯεখాݪ  4"8

Slide 2

Slide 2 text

$(whoami) w ࢯ໊Ճ౻फҰ࿠ ࡀ  w ϋϯυϧωʔϜ4"8 w 9 چ5XJUUFS !B[VLJ@FBUFS w ؔ੢ͷ*5ΤϯδχΞίϛϡχςΟͷ೐΍͔͠ ࣗশ  w େࡕࡏॅɾѪ஌ग़਎ w ಘҙ෼໺8FCΞϓϦέʔγϣϯ։ൃ w -BSBWFM 7VF w ॴଐ༗ݶձࣾΞϦ΢ʔϓ 2 چ+*4ϚʔΫ ⁴ ͕ ਓͷԣإʹݟ͑ͨͷ͸ ࣗ෼͚ͩͰ͸ͳ͍͸ͣ ࠓ೔ͷ໎ݴ

Slide 3

Slide 3 text

ඵએ఻ w 1)1ΧϯϑΝϨϯεؔ੢ਆށͰ։࠵ w ೔෇ ۚ ɾ ౔  w ։࠵৔ॴਆށӺલݚमηϯλʔ w ઈࢍϓϩϙʔβϧืूத w క੾ ೔ ·Ͱ w εϙϯαʔ΋ืूத 3 ϓϩϙʔβϧืूϑΥʔϜ εϙϯαʔืूࢿྉ

Slide 4

Slide 4 text

͜ͷτʔΫͷ֓ཁͱ໨ඪ w ೝՄٕज़ͷͭͰ͋Δ0"VUIͷجૅΛઆ໌ w ೝূɾೝՄͷجૅ w 0"VUIͱ͸Կ͔ w 0"VUIͷ࢖͍Ͳ͜Ζ w ؆୯ͳ࣮૷ྫΛަ͑ͨ0"VUIͷೝՄॲཧͷઆ໌ w ໨ඪ0"VUIͷجૅతͳॲཧͷྲྀΕΛ௫Ή w ʮখాݪͰΈΜͳͰֶ΅͏0"VUIʯˠʮখాݪͰجૅΛֶΜͩ0"VUIʯ 4

Slide 5

Slide 5 text

ຊτʔΫͷର৅ൣғͱର৅ऀ w ର৅ൣғ0"VUIͷ"VUIPSJ[BUJPO$PEFͷ࢓૊Έ͕ର৅ w جຊతͳॲཧϑϩʔΛத৺ʹઆ໌ w ࣮ફతͳ಺༰΍ৄࡉͳ࢓༷͸ର৅֎ w ଞͷೝՄ෇༩ํࣜ *NQMJDJU $MJFOU$SFEFOUJBMͳͲ ͸ൣғ֎ w ର৅ऀ0"VUIͷجૅʹڵຯͷ͋Δํ w 0"VUIʹ৮Εͨ͜ͱ͕ͳ͍ํ 5

Slide 6

Slide 6 text

͓͢͢Ίͷࢀߟॻ w 0"VUIపఈೖ໳ηΩϡΞͳೝՄγεςϜΛద༻͢ΔͨΊͷݪଇͱ࣮ફ w +VTUJO3JUDIFS "OUPOJP4BOTPஶɾਢాஐ೭༁ ᠳӭࣾ w 0"VUIͷجૅ஌͔ࣝΒؔ࿈ٕज़·Ͱ৮ΕΒΕ͍ͯΔ w ࣮૷ྫ΋ॆ࣮ ࣮૷ݴޠ͸+BWB4DSJQU  w ͜ΕҰ࡭Ͱ͔ͳΓֶ΂Δ 6

Slide 7

Slide 7 text

ೝূɾೝՄͱ0"VUI 7

Slide 8

Slide 8 text

ೝূͱೝՄ w ೝূ "VUIFOUJDBUJPO  w γεςϜʹొ࿥͞Ε͍ͯΔϢʔβʔͷຊਓΛ֬ೝ͢Δॲཧ w ྫ4/4΍&$αΠτͳͲͷ8FCγεςϜͷϩάΠϯ w γεςϜʹొ࿥͞Ε͍ͯΔϢʔβʔ৘ใͱ߹க͢Δ͜ͱͰγεςϜ͕ར༻Ͱ͖Δ w ೝՄ "VUIPSJ[BUJPO  w γεςϜͷػೳ΍Ϧιʔε΁ͷΞΫηεͷՄ൱Λ੍ޚ͢Δॲཧ w ྫ6/*9ͷϑΝΠϧγεςϜͷύʔϛογϣϯ w ϑΝΠϧ΁ͷૢ࡞͕ͦͷϢʔβʔʹରͯ͠ڐՄ͞Ε͍ͯΔ৔߹ʹͷΈૢ࡞͕Մೳ 8

Slide 9

Slide 9 text

0"VUIͱ͸ w 0"VUI8FCΞϓϦέʔγϣϯʹ͓͚ΔೝՄͷͨΊͷϓϩτίϧ w SEύʔςΟ੡ͷγεςϜ͔Β8FCαʔϏεʹΞΫηε͢Δ͜ͱΛೝՄ w ΞΫηετʔΫϯΛར༻ͯ͠8FCαʔϏεʹΞΫηε w ೝূʹؔ͢ΔϓϩτίϧͰ͸ͳ͍͜ͱʹ஫ҙ w ڐՄ͞Εͨݖݶͷൣғ είʔϓ ͰͷΈΞΫηε͕Մೳ w ݖݶͷൣғ͸8FCαʔϏεͷར༻ऀ͕ڐՄͨ͠ൣғ 9

Slide 10

Slide 10 text

0"VUIͷར༻ྫ w ESBXJP͔Β(PPHMF%SJWFʹΞΫηε w ESBXJP8FC্Ͱ࡞ਤͰ͖ΔαʔϏε w (PPHMF%SJWF(PPHMF੡ͷΫϥ΢υετϨʔδαʔϏε w ESBXJP͕(PPHMF%SJWFʹٻΊΔΞΫηεݖͷྫ w ετϨʔδ಺ͷϑΝΠϧͷಡΈࠐΈ w ετϨʔδ΁ͷϑΝΠϧͷอଘ 10 ESBXJP͔Β(PPHMF%SJWF΁ͷ ΞΫηεͷೝՄΛཁٻ (PPHMF%SJWFͰΞΫηεݖͷೝՄΛ֬ೝ

Slide 11

Slide 11 text

ͳͥ0"VUI͔ w 8FCαʔϏεͷೝূ৘ใΛSEύʔςΟ੡ͷγεςϜͱڞ༗͠ͳ͍ w 8FCαʔϏεଆͷೝূ৘ใΛมߋͯ͠΋ӨڹΛड͚ͳ͍ w ͦ΋ͦ΋ηΩϡϦςΟతʹೝূ৘ใΛ֎෦γεςϜͱڞ༗ͨ͘͠ͳ͍ w SEύʔςΟ੡ͷγεςϜ͕ཁٻ͢ΔݖݶΛ֬ೝͰ͖Δ w ཁٻ͞ΕΔݖݶͷ಺༰͕Ϣʔβʔʹࣔ͞ΕΔ w ϢʔβʔͷڐՄͳ͠ʹݖݶ͕෇༩͞ΕΔ͜ͱ͕ͳ͍ 11 ESBXJP͕ཁٻ͢Δ(PPHMF%SJWFͷݖݶͷ಺༰Λ Ϣʔβʔʹ֬ೝ͢Δྫ

Slide 12

Slide 12 text

0"VUIͷॲཧϑϩʔ 12

Slide 13

Slide 13 text

0"VUIʹ͓͚Δొ৔ਓ෺ w ΫϥΠΞϯτ $MJFOU  w อޢର৅ϦιʔεʹΞΫηε͢ΔSEύʔςΟ੡ͷιϑτ΢ΣΞ w อޢର৅Ϧιʔε 1SPUFDUFE3FTPVSDF  w Ϧιʔεॴ༗ऀ͕ΞΫηεݖΛ࣋ͭػೳ΍σʔλͳͲͷϦιʔε w Ϧιʔεॴ༗ऀ 3FTPVSDF0XOFS  w อޢର৅Ϧιʔε΁ͷΞΫηεݖΛ΋ͭϢʔβʔ w ೝՄαʔόʔ "VUIPSJ[BUJPO4FSWFS  w Ϧιʔεॴ༗ऀ͕ΫϥΠΞϯτΛೝՄ͢Δ࢓૊ΈΛఏڙ͢ΔγεςϜ 13

Slide 14

Slide 14 text

ొ৔ਓ෺ͷ۩ମྫ w ΫϥΠΞϯτESBXJP w อޢର৅Ϧιʔε(PPHMF%SJWF"1* w Ϧιʔεॴ༗ऀϒϥ΢βΛૢ࡞͍ͯ͠ΔϢʔβʔ w ೝՄαʔόʔ(PPHMFͷ0"VUIೝՄαʔόʔ 14

Slide 15

Slide 15 text

0"VUIͷॲཧϑϩʔ  Ϧιʔεॴ༗ऀ͕ΫϥΠΞϯτΛೝՄ w ཁٻ͞ΕΔݖݶͷ಺༰ΛϦιʔεॴ༗ऀʹఏࣔͯ͠ೝՄ͢Δ͔֬ೝ  ೝՄαʔόʔ͸ೝՄίʔυΛੜ੒  ΫϥΠΞϯτ͸ೝՄίʔυ͔ΒΞΫηετʔΫϯΛऔಘ  ΫϥΠΞϯτ͸ΞΫηετʔΫϯΛར༻ͯ͠อޢର৅ϦιʔεʹΞΫηε 15

Slide 16

Slide 16 text

0"VUIͷॲཧϑϩʔ 16 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ΫϥΠΞϯτΛೝՄ

Slide 17

Slide 17 text

0"VUIͷॲཧϑϩʔ 17 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ೝՄαʔόʔʹϦμΠϨΫτ ೝՄαʔόʔʹϦμΠϨΫτ

Slide 18

Slide 18 text

0"VUIͷॲཧϑϩʔ 18 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ΞΫηεݖͷೝՄΛ֬ೝ

Slide 19

Slide 19 text

0"VUIͷॲཧϑϩʔ 19 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ΞΫηεݖΛೝՄ

Slide 20

Slide 20 text

0"VUIͷॲཧϑϩʔ 20 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ೝՄίʔυΛΫϥΠΞϯτʹ ϦμΠϨΫτ ೝՄίʔυΛ ΫϥΠΞϯτʹ ϦμΠϨΫτ

Slide 21

Slide 21 text

0"VUIͷॲཧϑϩʔ 21 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ೝՄίʔυΛ ૹ৴

Slide 22

Slide 22 text

0"VUIͷॲཧϑϩʔ 22 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ΞΫηετʔΫϯΛ ൃߦ

Slide 23

Slide 23 text

0"VUIͷॲཧϑϩʔ 23 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ΞΫηετʔΫϯΛ෇ਵͯ͠ อޢର৅ϦιʔεʹΞΫηε

Slide 24

Slide 24 text

0"VUIͷॲཧϑϩʔ 24 ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ อޢର৅Ϧιʔε ೝՄ͞Εͨείʔϓ಺Ͱ ϦιʔεΛฦ٫

Slide 25

Slide 25 text

ೝՄίʔυͱΞΫηετʔΫϯ w ೝՄίʔυΞΫηετʔΫϯΛಘΔͨΊͷҰ࣌తͳίʔυ w Ϧιʔεॴ༗ऀʹΑΔΫϥΠΞϯτͷೝՄͷ݁ՌΛࣔ͢ίʔυ w codeͱ͍͏ΫΤϦύϥϝʔλʔΛ෇༩ͯ͠ΫϥΠΞϯτʹϦμΠϨΫτ w ΞΫηετʔΫϯอޢର৅Ϧιʔε΁ͷΞΫηεͰར༻͢ΔτʔΫϯ w อޢର৅Ϧιʔε͸ΞΫηετʔΫϯΛड͚औͬͯݖݶΛ֬ೝͯ͠ϦιʔεΛฦ͢ w อޢର৅Ϧιʔε͸ΫϥΠΞϯτ͔Β#FBSFSτʔΫϯͰड͚औΔ 25

Slide 26

Slide 26 text

είʔϓ w อޢର৅Ϧιʔε΁ͷΞΫηεݖΛࣔ͢จࣈྻ w ෳ਺ͷείʔϓ͸ۭനจࣈ۠੾ΓʹΑͬͯදݱ͞ΕΔ w ΫϥΠΞϯτ͕ΞΫηεͰ͖Δൣғ͸είʔϓͰࣔ͞Εͨൣғ಺ͷΈ w Ϧιʔεॴ༗ऀ͕ೝՄ͍ͯ͠ͳ͍είʔϓ΁ͷϦιʔεʹ͸ΞΫηεෆՄ 26

Slide 27

Slide 27 text

֤ॲཧϑϩʔͷ࣮૷ྫ 27

Slide 28

Slide 28 text

࣮૷ྫʹ͍ͭͯ w -BSBWFMͷίʔυͷҰ෦Λར༻ͯ͠આ໌ w 8FCαʔόʔͷػೳͳͲ0"VUIͷຊ࣭Ͱͳ͍෦෼ͷ࣮૷Λ؆ܿԽ w ಺෦ॲཧΛӅณ͠ͳ͍ͨΊʹ0"VUIͷϥΠϒϥϦ͸ར༻͠ͳ͍ w ࣮ફతͳΞϓϦέʔγϣϯ։ൃͰ͸0"VUIͷϥΠϒϥϦΛ࢖͏ํ͕ྑ͍ w 0"VUIͷ࣮૷ʹ͓͍ͯ͸ݴޠ΍ϑϨʔϜϫʔΫ͸ෆ໰ w ཧղͷ͠΍͢͞Λ༏ઌ w όϦσʔγϣϯͳͲͷ࣮ફతͳ಺༰͸লུ 28

Slide 29

Slide 29 text

࣮૷ྫͷ֤ߏ੒ཁૉ΁ͷΞΫηε w Ϧιʔεॴ༗ऀਓؒ ϒϥ΢β  w ΫϥΠΞϯτlocalhost:8000 w ೝՄαʔόʔlocalhost:8001 w อޢର৅Ϧιʔεlocalhost:8002 29

Slide 30

Slide 30 text

ΫϥΠΞϯτͷೝՄཁٻ w Ϧιʔεॴ༗ऀΛೝՄαʔόʔʹϦμΠϨΫτ w ϦμΠϨΫτ࣌ʹೝՄର৅ͷΫϥΠΞϯτͷ৘ใΛΫΤϦύϥϝʔλʹ෇༩ 30 $query = http_build_query([ 'response_type' => 'code', 'client_id' => env('CLIENT_ID'), 'redirect_uri' => 'http://localhost:8000/callback', 'scope' => 'file.read file.write', ]); $authEndpoint = Uri::new('http://localhost:8001/authorize') ->withQuery($query); return redirect()->away($authEndpoint); ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ ೝՄαʔόʔʹ ϦμΠϨΫτ localhost:8000 localhost:8001 ෇༩ํࣜ͸BVUIPSJ[BUJPODPEF ΫϥΠΞϯτ͕ཁٻ͢Δείʔϓ

Slide 31

Slide 31 text

ΫϥΠΞϯτͷೝՄͷ֬ೝ w ΫϥΠΞϯτΛೝՄ͢Δ͔Ϧιʔεॴ༗ऀʹ֬ೝ w είʔϓ͸ۭനจࣈ۠੾ΓͰΫΤϦύϥϝʔλͰ౉͞ΕΔ 31 $clientId = $request->query('client_id'); $client = Client::find($clientId); // 要求されているスコープを取得 $scope = str($request->query('scope')) ->explode(' ')->filter(); return view('authorize', [ 'client' => $client, 'scope' => $scope, ]); ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτͷ ೝՄΛ֬ೝ localhost:8001

Slide 32

Slide 32 text

ΫϥΠΞϯτͷೝՄ w ೝՄίʔυΛൃߦͯ͠ΫϥΠΞϯτͷίʔϧόοΫ63-ʹϦμΠϨΫτ w ೝՄίʔυͱϦιʔεॴ༗ऀ͕ڐՄͨ͠είʔϓΛΫΤϦύϥϝʔλͱͯ͠෇༩ 32 $scope = $request->input('scope'); $authzCode = Str::random(); $codes[$authzCode] = ['scope' => $scope]; Cache::put('codes', $codes); $callbackUrl = Uri::new($redirectUrl) ->withQuery([ 'scope' => $scope, 'code' => $authzCode, ]); return redirect()->away($callbackUrl); ೝՄαʔόʔ Ϧιʔεॴ༗ऀ ΫϥΠΞϯτ ΫϥΠΞϯτʹ ϦμΠϨΫτ localhost:8000 localhost:8001 ೝՄίʔυΛ෇༩

Slide 33

Slide 33 text

τʔΫϯͷऔಘ w ΫϥΠΞϯτ͸ೝՄαʔόʔʹೝՄίʔυΛૹ৴ w ΫϥΠΞϯτ͸#BTJDೝূͰࣝผ w ೝՄαʔόʔ͸ΫϥΠΞϯτʹΞΫηετʔΫϯΛൃߦ 33 ೝՄαʔόʔ ΫϥΠΞϯτ ೝূ৘ใͱೝՄίʔυΛ ૹ৴ localhost:8000 localhost:8001 $clientId = $request->getUser(); $clientSecret = $request->getPassword(); $codes = Cache::get('codes'); $code = $codes[$request->input('code')]; // クライアントの情報と認可コードを検証 $token = Str::random(); AccessToken::create(['token' => $token]); return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer', 'scope' => $code['scope'], ]); ΞΫηετʔΫϯΛૹ৴ #BTJDೝূͰΫϥΠΞϯτΛࣝผ

Slide 34

Slide 34 text

อޢର৅Ϧιʔε΁ͷΞΫηε w ΫϥΠΞϯτ͸อޢର৅ϦιʔεʹΞΫηετʔΫϯΛར༻ͯ͠ΞΫηε w ΞΫηετʔΫϯ͸#FBSFSτʔΫϯͰ౉͞ΕΔ w อޢର৅Ϧιʔε͸ϦιʔεΛΫϥΠΞϯτʹฦ٫ w ೝՄ͞Εͨείʔϓ֎ͷΞΫηε͸ڐՄ͠ͳ͍ 34 ΫϥΠΞϯτ ΞΫηετʔΫϯΛ෇༩ͯ͠ ϦιʔεʹΞΫηε localhost:8000 localhost:8002 Ϧιʔεͷ಺༰Λฦ٫ อޢର৅Ϧιʔε $token = $request->bearerToken(); $accessToken = AccessToken::whereFirst('token', $token); if ($accessToken?->scope->contains('file.read')) { $content = Storage::json('data.json'); return response()->json($content); } else { return response()->json(null, 403); } #FBSFSτʔΫϯ͔Β ΞΫηετʔΫϯΛऔಘ ΞΫηετʔΫϯʹཁٻ͞ΕΔ είʔϓ͕ଘࡏ͢Δ͔νΣοΫ

Slide 35

Slide 35 text

མึर͍ w ϦϑϨογϡτʔΫϯΞΫηετʔΫϯΛ࠶ൃߦ͢ΔͨΊͷίʔυ w ༗ޮظݶ͕੾Εͨ৔߹ͳͲʹϦιʔεॴ༗ऀʹೝՄΛٻΊΔ͜ͱͳ͘࠶ൃߦ w TUBUF$43'Λ๷͙ͨΊͷύϥϝʔλʔ w ೝՄίʔυͷૹ৴ݩ͕Ϧιʔεॴ༗ऀ͕ೝՄͨ͠ΫϥΠΞϯτͱಉҰ͔֬ೝ 35 ࢓্༷͸ඞਢͰ͸ͳ͍͕ɺηΩϡϦςΟϗʔϧʹͳΔͨΊ ࣄ্࣮ඞਢͷύϥϝʔλͱߟ͑ͨํ͕ྑ͍ ௥ه

Slide 36

Slide 36 text

·ͱΊ w 0"VUIͷجૅʹ͍ͭͯઆ໌ w ೝূɾೝՄʹ͍ͭͯઆ໌ w 0"VUIͷ֓ཁͱ࣮ྫΛઆ໌ w 0"VUIͷೝՄॲཧϑϩʔʹ͍ͭͯઆ໌ w ֤ཁૉͷॲཧ಺༰Λ؆୯ͳ࣮૷ྫΛ༻͍ͯઆ໌ 36

Slide 37

Slide 37 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠