mgsmus
Merhaba,
http://localhost:8000/oauth/token şeklinde deneme yaptım oldu. Bu konu hakkında birkaç şey daha sormak istiyorum daha iyi anlamak adına.
Mesela http://localhost:8000/oauth/token adresine boş bir istek yaptığımda veya header kısmında Content-type : application/json göndermediğimde dönen hata mesajı:
{
"error": "unsupported_grant_type",
"error_description": "The authorization grant type is not supported by the authorization server.",
"hint": "Check that all required parameters have been provided",
"message": "The authorization grant type is not supported by the authorization server."
}
Ama bilgileri girdiğimde access_token ve refresh_token alabiliyorum.
> {
> "grant_type": "password",
> "client_id": 2,
> "client_secret":"h4gVOTtI8WYEdrshfajguNvhDyPh2NT26hAN5Nn9",
> "username": "1yalcinsahin1@gmail.com",
> "password": "12345"
> }
Bu aşamada sormak istediğim:
1- Content-type yollamadığında veya bazı bilgileri eksik yolladığında bunların hata mesajlarını özelleştirebilir miyim ? Yoksa bu yapıyı kullanmayıp kendim mi bir yapı yazmam gerekir.(Aşağıda örnek bir yapı da kullandım)
2- access_token expires_at zamanında veritabanından silineceğini düşünüyordum ama herhangi bir silme işlemi olmadı.refresh_token kullanılarak buraya aynı istek attığımda da yenisi oluşuyor?
AuthserviceProvider kısmında deneme amaçlı bu şekilde bir kullanım yaptım.
Passport::tokensExpireIn(now()->addMinutes(1));
Passport::refreshTokensExpireIn(now()->addMinutes(5));
Passport::personalAccessTokensExpireIn(now()->addMinutes(1));
3- http://localhost:8000/api/user GET tipinde bir istek attığımda header kısmını
Authorization : Bearer {{token}}
Accept: application/json
belirttiğimde eğer token expires_at olmuşsa aşağıdaki dönüşü alıyorum:
> {
> "message": "Unauthenticated."
> }
Ama Accept belirtmediğimde html olarak dönüş hatası alıyorum.
Symfony\Component\Routing\Exception\RouteNotFoundException: Route [login] not defined.
İlgili kısmı kontrol ettiğimde Authenticate.php kısmında sadece bu fonksiyon var:
> /**
> * Get the path the user should be redirected to when they are not authenticated.
> *
> * @param \Illuminate\Http\Request $request
> * @return string
> */
> protected function redirectTo($request)
> {
> if (! $request->expectsJson()) {
> return route('login');
> }
> }
Bu kısmı benim mi doldurmam gerekiyor ?
-------Aşağıda örnek bir uygulamayı inceledim. Biraz da kendim özelleştirmek istedim:
api.php dosyasında kullandığım metod:
Route::prefix('api/v1')->group(function(){
Route::post('login', 'UserController@loginUser');
Route::post('register', 'UserController@registerUser');
Route::group(['middleware' => 'auth:api'], function(){
Route::apiResource('user-detail', 'UserController@userDetail');
Route::apiResource('update-user', 'UserController@update');
});
});
UserController:
class UserController extends Controller
{
private $success_status = 200;
public function registerUser(Request $request)
{
// --------------------- [ User Registration ] ---------------------------
$validator = Validator::make($request->all(),
[
'name' => 'required',
'email' => 'required',
'password' => 'required'
]
);
// if validation fails
if ($validator->fails()) {
return response()->json(["validation errors" => $validator->errors()]);
}
$input = array(
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
);
$user = User::create($input);
return response()->json(["success" => true, "status" => "success", "user" => $user]);
}
// --------------------------- [ User Login ] ------------------------------
public function loginUser(Request $request)
{
$validator = Validator::make($request->all(),
[
'email' => 'required',
'password' => 'required',
]
);
// check if validation fails
if ($validator->fails()) {
return response()->json(["validation errors" => $validator->errors()]);
}
$email = $request->email;
$password = $request->password;
$user = DB::table("users")->where("email", "=", $email)->first();
if (is_null($user)) {
return response()->json(["success" => false, "message" => "Kayıtlı e-mail bulunamadı!"]);
}
if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
$user = Auth::user();
$token = $user->createToken('token')->accessToken;
$success['success'] = true;
$success['message'] = "Başarılı bir şekilde giriş yaptınız!";
$success['token'] = $token;
return response()->json(['success' => $success], $this->success_status);
} else {
return response()->json(['error' => 'Yetkisiz İşlem'], 401);
}
}
// ---------------------------- [ Use Detail ] -------------------------------
public function userDetail()
{
$user = Auth::user();
return response()->json(['success' => $user], $this->success_status);
}
// -------------------------- [ Edit Using Passport Auth ]--------------------
public function update(Request $request)
{
$user = Auth::user();
$validator = Validator::make($request->all(),
[
'name' => 'required',
'email' => 'required',
'password' => 'required',
]
);
// if validation fails
if ($validator->fails()) {
return response()->json(["validation errors" => $validator->errors()]);
}
$userDataArray = array(
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
);
$user = User::where('id', $user->id)->update($userDataArray);
return response()->json(['success' => true, 'message' => 'Kullanıcı güncellendi!']);
}
// ----------------------------- [ Delete User ] -----------------------------
public function destroy()
{
$user = Auth::user();
$user = User::findOrFail($user->id);
try {
$user->delete();
return response()->json(['success' => true, 'message' => 'Kullanıcı silindi!']);
} catch (\Exception $e) {
return response()->json(['error' => true, 'message' => "Kullanıcı silinemedi!"]);
}
}
}
Yukarıda kullanılan tüm token isteklerinde expires_at süresine bakmaksızın yeni bir token üretiyor. (/oauth/token veya /login)
Bu örnek uygulama aslında internette incelediğim 8-9 uygulamanın birebir aynısı. Herkes aynı örnek üzerinden anlatım yapmış. Örnekleri kendimde uyguladım. Ama yukarıda belirttiğim soruları nasıl çözdüklerini bulamadım.
İncelediğim kaynakları da birleştirince de parçaları tam oturmamış bir puzzle oluştu kafamda. Laravelin verdiği örnekler çok ucu açık. Burada ne yapabilirim ?