LaravelのREST APIをBASIC認証にしてみた
2017年3月15日
前回作ったREST APIをweb認証するようにして、C#からGET、PUT、DELETEでアクセスしてみる。
– 手順 –
1.LaravelのメールをGMAILを使って送信できるようにしとく
Laravelのユーザーでパスワードをリセットしたときに、メールで認証したりするので。
①送信元の設定
1 2 3 4 5 6 |
'host' => env('MAIL_HOST', 'smtp.gmail.com'), 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'xxxxx@gmail.com'), 'name' => env('MAIL_FROM_NAME', 'Laravel'), ], |
②メールサーバーの設定
1 2 3 4 5 6 |
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=xxxxx@gmail.com MAIL_PASSWORD=xxxxx MAIL_ENCRYPTION=tls |
2.Laravelの認証設定
①ルート定義
1 2 |
# cd /var/www/blood # php artisan make:auth |
②マイグレート
1 |
# php artisan migrate |
1 2 3 4 5 |
[root@app-server blood]# php artisan migrate Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2017_03_09_135631_create_bloods_table |
認証に使うテーブルが3個できた。
③ユーザー登録
http:/サーバー/register で登録する
④apiの修正
認証を使うようにする。
1 2 3 4 |
Route::get('blood', 'BloodController@index')->middleware('auth.basic'); Route::get('blood/{from}/{to}', 'BloodController@show')->middleware('auth.basic'); Route::put('blood', 'BloodController@update')->middleware('auth.basic'); Route::delete('blood/{date}/{time}', 'BloodController@destroy')->middleware('auth.basic'); |
->middleware(‘auth.basic’)を付けただけ。
⑤HttpRequesterでテストする
できた。(o^-‘)b グッ!
3.C#から使う
ヘッダにAuthorizationを追加しただけ。
wc.Headers[“Authorization”] = “Basic ” + Convert.ToBase64String(Encoding.Default.GetBytes(“user@usr.usr:password”));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
public IList<BloodModel> Read(DateTime from, DateTime to) { IList<BloodModel> model; // URL string url = string.Format("http://192.168.0.135/api/blood/{0}/{1}", from.ToString("yyyy-MM-dd"), to.ToString("yyyy-MM-dd")); using (WebClient wc = new WebClient()) { wc.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("user@usr.usr:password")); var json = wc.DownloadString(url); model = JsonConvert.DeserializeObject<IList<BloodModel>>(json); } return model; } public bool Update(BloodModel model) { bool res = false; try { string url = string.Format("http://192.168.0.135/api/blood"); string json = JsonConvert.SerializeObject(new List<BloodModel>() { model }); var request = (HttpWebRequest)WebRequest.Create(url); request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("user@usr.usr:password")); request.Method = "PUT"; request.ContentType = "application/json"; request.ContentLength = json.Length; using (var writer = new StreamWriter(request.GetRequestStream())) { writer.Write(json); } var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); Debug.WriteLine(responseText); } res = true; } catch (Exception e) { Debug.WriteLine(e.Message); } return res; } public bool Delete(BloodModel model) { bool res = false; try { string url = string.Format("http://192.168.0.135/api/blood/{0}/{1}", model.Date.ToString("yyyy-MM-dd"), model.Time); WebRequest request = WebRequest.Create(url); request.Method = "DELETE"; request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("user@usr.usr:password")); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); Debug.WriteLine(responseText); } res = true; } catch(Exception e) { Debug.WriteLine(e.Message); } return res; } |
完成。(∩´∀`)∩
—
一応認証はできたが、apiトークン認証の方がいいのだろうか。(´ヘ`;) う~ん・・・
参考サイト
Laravel 5.3 認証 – https://readouble.com/laravel/5.3/ja/authentication.html