我在科尔多瓦建立一个混合应用程序,并使用laravel作为api,但是有点混淆了Auth:api,我找不到任何东西解释我想要什么!我想知道一个用户如何从他的手机上的应用程序认证到我的laravel api,据我所知,我将使用一个api_token(随机字符串),我将要存储在Users表上,这是很好的我如何使用它进行身份验证,以及如何让用户发送所有请求?我可以将它存储在应用程序中并继续发送吗?我卡住了登录!如何第一次登录用户?我会使用laravel提供的登录或为此建立一个新的?请帮助
欢迎各位兄弟 发布技术文章
这里的技术是共享的
0 | |
添加评论 |
1个 | 为了 现在你的其余问题: 对于登录,您将需要一个客户端用于登录的API调用,假设:
与身体:
在Laravel可以代表:
现在在该 如果凭据不匹配,那么您将回复, 对于其他问题,是的,客户端应用程序必须记住 请注意,Laravel会
| |||
2016年1月13日14:44
Laravel 5.2对允许多种身份验证方法有更好的支持。
例如,您可能希望在网站上授权用户使用用户名和密码,但在API上使用随机标记字符串。
设置令牌是简单的,假设你有所有的默认配置。首先,您需要添加一个列api_token
给您的用户表。它可以是任何长度,但它的时间越长越安全。
以下是迁移示例:
Schema::table('users', function (Blueprint $table) {
$table->char('api_token', 60)->nullable()->after('remember_token');
});
那么您需要确保API API路由指定了api后卫。不幸的是,Laravel本身不能确定这一点; 它只是默认为网络防护。
Route::group(['middleware' => ['auth:api']], function()
{
// API routes here
});
最后,您只需要api_token
在发送API请求时传递此信息。有多种方法可以做到这一点。查看TokenGuard课程,看看我在哪里得到这个:
api_token
以下是您如何使用Guzzle中的每一种方法:
$guzzle = new GuzzleHttp\Client();
$guzzle->request($url, ['api_token' => $api_token]);
$guzzle->request($url, [], ['headers' => ['Authorization' => 'Bearer ' . $api_token]]);
$guzzle->request($url, [], ['auth' => [$username, $api_token]]);
承载令牌可能需要一些额外的设置。Apache有时会从请求中剥离授权令牌,因此您需要将这两行添加到您的public/.htaccess
文件中:
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
最后,当然,您需要为使用API的每个用户生成一个api_token。最好在创建用户时执行此操作。
关于升级的注意事项
如果您从Laravel 5.1或更早版本升级,您可能需要更新其他文件。
如果您遵循升级说明,您应该已经添加了一个带有“令牌”驱动程序的“api”警卫config/auth.php
:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
您可能还需要更新您的Authenticate
中间件。在文件中app/Http/Middleware/Authenticate.php
,确保您的handle
方法采用一个$guard
参数,并且在检查用户是否登录时使用该保护。最终方法应如下所示:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('auth/login');
}
}
return $next($request);
}
发表于2年前 BY ISAACKEARL
我想学习如何使用laravel作为具有auth的实际RESTful API。
可以由移动应用程序使用或可被其他Web应用程序访问和使用的东西。查找有关如何执行授权部分的信息有很多麻烦。
我知道我可以使我的路线和返回JSON对象。我很难理解的是如何验证,所以我可以保护我的API中的数据,除非有人被授权使用它。
有人可以给我一些提示吗?
Laracasts有一个系列:https://laracasts.com/series/incremental-api-
@blackbird我一直在看这个系列,一切都是有道理的,除了这不能回答我的问题。本系列的唯一认证是使用卷曲或邮递员进行“基本认证”。我不知道基本身份验证是否合适。看起来像使用基本身份验证,您必须不断重新验证每个请求,并且必须在标题中使用用户名和密码。
@Ruffle我了解使用json而不是视图的部分。我希望有人可以从经验中提供一些信息,作为设置身份验证的最佳方式。
似乎只有Basic Auth的例子。什么更适合更先进的实施?有没有人实际上使用laravel制作API,然后是非常基本的API?
@isaackearl我强烈推荐JWT - https://github.com/firebase/php-jwt
基本上,在身份验证中,您可以在设备上本地创建和存储令牌。然后每次打电话到服务器时,都会检查该令牌,并确保用户是他们说的。
如果需要,您可以存储令牌到期,但是由于数据存在于令牌中,因此不需要。
通常,JWT用于无状态应用程序,因此您需要远离服务器会话的概念。
感谢你们的回应。我要结帐JWT
@isaackearl你最后做了什么?
@luddinus 我最终使用tymon / jwt-auth(https://github.com/tymondesigns/jwt-auth)实现JWT 。 这是非常好的,得到它的设置是很容易的。这是非常可配置的,这对我们来说是一个很好的奖励。如果你决定去同一条路线,你可以随时给我发消息,如果你需要一个例子。
@isaackearl 可以提供一个例子
@isaackearl您如何为两个不同的身份验证表(一个用于用户凭据,另一个用于管理凭据)实现JWT
@shivamnetwork有没有一个具体的例子你正在寻找?如果你有一个更具体的问题,那么我应该可以回答。无论如何,我将尝试给出一个我如何使用JWT进行身份验证的例子。
wiki中提供的示例是一个很好的开始。
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class AuthenticateController extends Controller
{
public function authenticate(Request $request)
{
// grab credentials from the request
$credentials = $request->only('email', 'password');
try {
// attempt to verify the credentials and create a token for the user
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['error' => 'could_not_create_token'], 500);
}
// all good so return the token
return response()->json(compact('token'));
}
}
在此示例中,用户使用用户名和密码进行身份验证,但使用JWTAuth Facade代替laravel提供的常规Auth内容。最后,此操作返回一个可由您的前端使用以创建后续请求的令牌。
然后,您可以使用中间件检查后续请求,以确保用户具有有效的令牌。这是中间件的示例:
class GetUserFromToken extends BaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
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);
}
}
然后,您可以使用这个中间件来控制您的控制器,以确保它们先被认证。
这是从包中提供的默认内容中提取的。这不一定是我实现它,因为每个实现都有特定的需求。如果你有一个更具体的问题,我会尽力帮助。
你是否使用某种多重认证包?告诉我一些更多关于你已经拥有和你想完成什么,我会尽我所能给你一个答案。
我的初衷是告诉你将它全部放在一个表中,并使用角色来确定它是管理员还是普通用户。
那么再次,我意识到你可能会有一种情况,你真的想把它们保存在单独的表中,因为它们没有重叠的数据,然后他们都需要能够登录或类似的东西。
如果是这样,那么我可以推荐一些我以前做过的事情,但是我想了解一些关于你的情况的一些事情,然后我花了很多时间写出你可能不需要的例子。
我没有使用Multi auth包。
我有两个实体/表 - 一个是商家和其他是客户。即使是商家用户也可以成为另一个商家的客户,所以email_id将是一样的,所以我没有保持相同的表格并在这里使用角色。根据不同的实体有不同的自定义声明。我正在寻找两个不同的表。
我已经实现了Sean在wiki中写的内容 - https://github.com/tymondesigns/jwt-auth/wiki,你在上面的回复中写过。一个实体/表可以正常工作。我被困在如何使用不同的实体。
那么这个jwt auth包应该有一个代表用户的表。它使用各种功能,如JWTAuth :: toUser()等从jwt.php配置文件读取用户类型。但这并不意味着你必须改变你的结构。
这是我如果我是你,我会如何处理。
我将从您的客户和商家表格创建一个单独的用户表,并移动其中的常见元素,如密码,电子邮件或用户名。从你上面所说的,你可能已经有一个单独的表格,其中有电子邮件,你可能可以使用..
无论如何,一旦创建了该表,您将添加2列,以便与需要进行身份验证的两种类型的模型建立多态关系。因此,例如,users表将具有authentatable_id和authentatable_type。
用户变形为客户或商家
// in User model
public function authenticatable()
{
return $this->morphTo('authenticatable');
}
商家和客户都可以访问一个变形的用户
// in Merchant model and Customer model.
public function user()
{
return $this->morphOne('App\User', 'authenticatable');
}
那么您可以使用用户模型中的用户进行身份验证。但是直接之后,您可以使用商家模型或客户模型($ user->可验证返回商家或客户在这种情况下)。要以其他方式,您可以简单地说$ customer-> user来获取用户属性。
您可以设置不同的登录门户,并确保已验证的用户具有正确的类型。
if ($user->authenticatable_type == 'App\\Merchant')
如果您已将所有用户电子邮件存储在客户和商家上,并且您不希望将常用元素移出,则仍可以使用具有相同关系的用户模型。但是,不要访问$ user-> password等属性, $ user-> email等...您可以创建一个界面,并将其包含在客户和商家模型中。您可以提供getPassword,getEmail等方法,以便您的用户模型可以使用$ user-> getEmail()方法,它知道如何从商家或客户表中获取电子邮件字段。
如果这是一个听起来像是一个很好的方法,并希望更多的帮助/澄清,当你遇到问题让我知道。如果不是,我很抱歉,我不能帮助更多,我不知道另外一种方式使用2个完全独立的表与这个特定的包。
来自 https://laracasts.com/discuss/channels/general-discussion/laravel-5-api-auth-for-a-mobile-app-or-ano...
Auth::guard('api')->user()
返回Authenticated用户? - brahimm Feb 15 at 23:25