我有一个用Laravel,Dingo和JWT Tokens驱动的API.使用PAW测试API调用非常有效.使用jQuery运行API调用而没有中间件JWT令牌禁用工作正常.但是当我尝试使用JWT Tokens运行Ajax请求时,我得到401.
我错过了Ajax请求的技巧.你能看到这段代码有问题吗?
$.ajax({
url: "http://api.domain.app/products",
dataType : 'jsonp',
type: 'GET',
beforeSend : function(xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", "Bearer XXXX");
},
error : function() {
// error handler
},
success: function(data) {
console.log(data);
return data;
}
});
Run Code Online (Sandbox Code Playgroud)
由于Cross Domain,我不得不使用jsonp.但是,这一点在JWT中间件上工作得很好.
希望你能指教..
我们的 Eloquent 模型具有遵循 Laravel 蛇形案例约定的属性。
例如first_name,last_name和created_at
虽然我的前端(react)遵循 javascript 驼峰式大小写标准。
例如firstName,lastName和createdAt
发送 API 响应时是否有一种简单的方法可以将所有属性转换为驼峰式大小写?
我们使用 Larave 5.2 和 Dingo API 包。
根据接受的答案,我使用了自定义响应格式方法。请参阅以下实施要点(包括单元测试):
https://gist.github.com/andrewmclagan/c5e0fe601d23f3b859b89a9f8922be68
我有一个使用tymon/jwt-auth软件包验证JWT用户的中间件:
public function handle($request, \Closure $next)
{
if (! $token = $this->auth->setRequest($request)->getToken()) {
return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
}
try {
$user = $this->auth->authenticate($token);
} catch (TokenExpiredException $e) {
return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
} catch (JWTException $e) {
return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
}
if (! $user) {
return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
}
$this->events->fire('tymon.jwt.valid', $user);
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个控制器,我想将用户从中间件传递给控制器.
所以我在控制器上做了:
public function __construct()
{
$this->user = \Auth::user();
}
Run Code Online (Sandbox Code Playgroud)
问题是,$this->user是null的,但我做这个控制器的方法时,它不是空.
所以:
public function __construct()
{ …Run Code Online (Sandbox Code Playgroud) 我已使用Dingo框架在Laravel中开发了一个API。现在,我想通过Facebook和/或Google登录(例如,使用OAuth)保护API访问权限
有教程或类似的东西吗?我不知道如何将安全的API访问集成到我的api中。
谢谢!
我有两个表来保存数据。其中之一有外键,因此我有一对多的关系。但是,我不明白如何将数据同时保存到两个表中。我有一个查询,其中包含一个表的数据和另一个应附加到第一个表的数据。
这是主要模型
class Site extends Model
{
protected $fillable = ['path', 'site_link'];
public $timestamps = false;
public function features() {
return $this->hasMany('App\SiteFeature');
}
}
Run Code Online (Sandbox Code Playgroud)
这是子模型
class SiteFeature extends Model
{
protected $fillable = ['feature', 'site_id'];
public $timestamps = false;
}
Run Code Online (Sandbox Code Playgroud)
现在我的控制器看起来像这样
class SiteController extends BaseController
{
public function index()
{
return Site::all();
}
public function show(Site $id)
{
return $this->response->item($id, new SiteTransformer);
}
public function store(Request $request)
{
$site = Site::create($request->all());
return response()->json($site, 201);
}
Run Code Online (Sandbox Code Playgroud)
我知道它会将其保存为一份数据。我请求你帮助我将数据分成两个表。在文档中,我找到了存储与数据库中现有模型的关系的方法,但是我在创建时没有该模型。
我刚刚安装了Dingo,它似乎可以使用以下URL:
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
$api->get('test', function () {
return 'Test';
});
$api->get('hello', function () {
return 'Hello';
});
});
Run Code Online (Sandbox Code Playgroud)
我希望版本1包含在URL中,如何使它工作?当我尝试:
http://website.dev/api/v1/test
我得到错误:
{
"message": "404 Not Found",
"status_code": 404
}
Run Code Online (Sandbox Code Playgroud)
在.env文件中,我有:API_PREFIX=api
根据Dingo配置:
避免将版本号作为前缀或子域,因为版本控制是通过Accept标头处理的。
我在Laravel项目中使用的是Transformer。当我在Transformer中不包含其他对象时,没有任何问题,但是当我包含该Customer对象时,出现以下错误:
传递给App \ Transformers \ CustomerTransformer :: transform()的参数1必须是App \ Models \ Customer的实例(给定布尔值),在/home/vagrant/Code/project/vendor/league/fractal/src/Scope.php中调用在第365行并定义
当我从中打印对象时,Scope.php其中没有任何布尔值。可能是什么问题呢?(代码在Review之后崩溃#298。
我如何调用代码:
$reviews = $this->review->paginate();
$transformer = new ReviewTransformer();
$with = $request->get('with', null);
if($with) {
$with = explode(';', $with);
$transformer->parseIncludes($with);
}
return $this->response->paginator($reviews, $transformer);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 dingo 为 laravel 5.3 制作rest api。我在我的项目中设置了 dingo 并创建了一个像这样的 api 路由用于 test 。
$api->version('v1', function ($api) {
$api->get('hello',function (){
return "hello";
});
});
Run Code Online (Sandbox Code Playgroud)
但是当我运行 http://localhost:8000/api/hello时
然后
{
message: "Call to undefined method Illuminate\Routing\Route::getUri()",
code: 1,
status_code: 500,
debug: {
line: 98,
file: "C:\xampp\htdocs\apiTest\vendor\dingo\api\src\Routing\Adapter\Laravel.php",
class: "Symfony\Component\Debug\Exception\FatalErrorException",
trace: [
"#0 {main}"
]
}
}
Run Code Online (Sandbox Code Playgroud)
显示。
我已经搜索并找到了这个解决方案 Call to undefined method Illuminate\Routing\Route::get()
但是当我使用
use Illuminate\Support\Facades\Route;
Run Code Online (Sandbox Code Playgroud)
那么这个问题就显示出来了
FatalErrorException in Laravel.php line 116:
Call to undefined method Illuminate\Support\Facades\Route::where()
Run Code Online (Sandbox Code Playgroud)
这是 Laravel.php 文件
<?php
namespace Dingo\Api\Routing\Adapter;
use …Run Code Online (Sandbox Code Playgroud) 我已经建立了一个带有vuejs前端和laravel后端的网站.
登录的唯一方法是使用Socialite通过Facebook登录
一切正常.
现在我正在构建一些React Native应用程序(Ios/Android),它们也使用Facebook登录但需要与同一个web api进行交互.
我想使用JWT来保护React Native的API - > Laravel API
我在Laravel端设置了JWT w/Dingo,我可以使用JWTAuth :: fromUser()生成令牌.我已经建立了一些使用令牌进行身份验证的API端点..到目前为止一切都很好.
现在这里变成了粘性的部分.据我所知,在Laravel方面你可以为任何用户创建JWT令牌.现在JWT"标识符"只是"id"..而且我理解我从JWTAuth :: fromUser()生成的令牌只是不知道或不关心此用户没有传统凭据,而是使用Facebook登录.
然而,在React Native方面,当新用户首次通过Facebook登录进行身份验证时......它不知道Laravel应用程序中的"匹配用户"是什么,我必须继续进行的只是唯一的Facebook提供商ID.
所以问题如下:
如何仅使用Facebook Provider ID和JWT Secret在React Native端生成JWT令牌,更重要的是,如何在Laravel端修改我的JWT代码,以便它可以理解使用Facebook生成的令牌提供者ID和JWT令牌
换句话说,我认为我的Laravel JWT实现需要进行修改,以便纯粹基于Facebook Provider Id创建/解析令牌,否则它将无法与React Native端生成的令牌匹配.
非常感谢!!
我正在使用Laravel 5.4,我写了类似的东西:
Cookie::queue(
'refresh_token',
$data->refresh_token,
864000, // 10 days
null,
null,
false,
true // HttpOnly
);
return response('hello world');
Run Code Online (Sandbox Code Playgroud)
返回的响应不包含refresh_token cookie return response('hello world')->withCookie(...).
Laravel 5.4文档不再像5.0 doc那样声明排队cookie.这是否意味着在5.4版本中删除了该功能,或者我的代码中出错?
为了完整起见,我使用的是Dingo API包,并且响应是精心设计的.
谢谢您的帮助.
dingo-api ×10
laravel ×10
php ×6
jwt ×2
ajax ×1
cookies ×1
database ×1
facebook ×1
javascript ×1
jquery ×1
laravel-5.1 ×1
laravel-5.2 ×1
oauth ×1
react-native ×1
reactjs ×1
rest ×1