欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

laravel 5.2 building api Auth guzzle GuzzleHttp 有大用

我在科尔多瓦建立一个混合应用程序,并使用laravel作为api,但是有点混淆了Auth:api,我找不到任何东西解释我想要什么!我想知道一个用户如何从他的手机上的应用程序认证到我的laravel api,据我所知,我将使用一个api_token(随机字符串),我将要存储在Users表上,这是很好的我如何使用它进行身份验证,以及如何让用户发送所有请求?我可以将它存储在应用程序中并继续发送吗?我卡住了登录!如何第一次登录用户?我会使用laravel提供的登录或为此建立一个新的?请帮助

分享改善这个问题
 

为了auth:api在Laravel 5.2中使用防护装置,请参见https://andrew.cool/blog/64/How-to-use-API-tokens-for-authentication-in-Laravel-5-2它似乎相当彻底。

现在你的其余问题:

对于登录,您将需要一个客户端用于登录的API调用,假设:

POST logins

与身体:

{
  "email": "user@example.com",
  "password": "password"
}

在Laravel可以代表:

Route:post('logins', 'MyApiController@login');

现在在该MyApiController::login()方法中,您将检查所提供的凭据emailpassword如果它们与您的数据库中的记录相匹配,那么您将以一个响应api_token。该api_token可以在飞行中创建(使其难以中断),或者如果用户已经有一个api_token可以返回那个。这取决于您的到期政策,如果您希望登录也意味着退出其他设备等。

如果凭据不匹配,那么您将回复,400 Bad Request并且客户端应该尝试再次登录。

对于其他问题,是的,客户端应用程序必须记住api_token 并将其包含在需要它的每个API调用中

请注意,Laravel会api_token按照下面的代码(即Laravel 5.4)查看特定的顺序。在我给你上面的链接中,有关于如何包括的说明api_token

public function getTokenForRequest()
{
    $token = $this->request->query($this->inputKey);

    if (empty($token)) {
        $token = $this->request->input($this->inputKey);
    }

    if (empty($token)) {
        $token = $this->request->bearerToken();
    }

    if (empty($token)) {
        $token = $this->request->getPassword();
    }

    return $token;
}
分享改善这个答案
 
   
谢谢你,如果我这样做可以Auth::guard('api')->user()返回Authenticated用户? -  brahimm Feb 15 at 23:25
   
是的,请看TokenGuard :: user()来查看详细信息 -  Ioannis Lalopoulos Feb 15 at 23:34

来自  https://stackoverflow.com/questions/42244962/laravel-5-2-building-api-auth

 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课程,看看我在哪里得到这个:

  • 作为一个GET参数命名 api_token
  • 作为授权标题(Authorization:Bearer [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);
}

 LARAVEL

来自 https://andrew.cool/blog/64/How-to-use-API-tokens-for-authentication-in-Laravel-5-2

Laravel 5 API + AUTH用于移动应用程序或其他Web应用程序

发表于2年前 BY ISAACKEARL

我想学习如何使用laravel作为具有auth的实际RESTful API。

可以由移动应用程序使用或可被其他Web应用程序访问和使用的东西。查找有关如何执行授权部分的信息有很多麻烦。

我知道我可以使我的路线和返回JSON对象。我很难理解的是如何验证,所以我可以保护我的API中的数据,除非有人被授权使用它。

有人可以给我一些提示吗?

最佳答案(由isaackearl选定)
beardedbrew

@isaackearl我强烈推荐JWT - https://github.com/firebase/php-jwt

基本上,在身份验证中,您可以在设备上本地创建和存储令牌。然后每次打电话到服务器时,都会检查该令牌,并确保用户是他们说的。

如果需要,您可以存储令牌到期,但是由于数据存在于令牌中,因此不需要。

通常,JWT用于无状态应用程序,因此您需要远离服务器会话的概念。

bobbybouwmann
 bobbybouwmann
2年前(868,055 XP)

Laracasts有一个系列:https://laracasts.com/series/incremental-api-

 
荷叶边
 荷叶边
2年前(273,850 XP)

主要的区别是你使用:

return Response::json([
    //array of data
]);

代替:

return view();

在你的控制器方法。

 
isaackearl
isaackearl
2年前(26,350 XP)

@blackbird我一直在看这个系列,一切都是有道理的,除了这不能回答我的问题。本系列的唯一认证是使用卷曲或邮递员进行“基本认证”。我不知道基本身份验证是否合适。看起来像使用基本身份验证,您必须不断重新验证每个请求,并且必须在标题中使用用户名和密码。

@Ruffle我了解使用json而不是视图的部分。我希望有人可以从经验中提供一些信息,作为设置身份验证的最佳方式。

似乎只有Basic Auth的例子。什么更适合更先进的实施?有没有人实际上使用laravel制作API,然后是非常基本的API?

 
荷叶边
 荷叶边
2年前(273,850 XP)

寻找一些OAuth或JWT教程。我不知道是否与Laravel混合,但是您可能会发现很多使用JavaScript框架(例如:Express和Angular)。一般情况仍然适用。

 
beardedbrew
beardedbrew
2年前(1,075 XP)

@isaackearl我强烈推荐JWT - https://github.com/firebase/php-jwt

基本上,在身份验证中,您可以在设备上本地创建和存储令牌。然后每次打电话到服务器时,都会检查该令牌,并确保用户是他们说的。

如果需要,您可以存储令牌到期,但是由于数据存在于令牌中,因此不需要。

通常,JWT用于无状态应用程序,因此您需要远离服务器会话的概念。

 
isaackearl
isaackearl
2年前(26,350 XP)

感谢你们的回应。我要结帐JWT

 
luddinus
luddinus
2年前(23,880 XP)

@isaackearl你最后做了什么?

 
isaackearl
isaackearl
2年前(26,350 XP)

@luddinus 我最终使用tymon / jwt-auth(https://github.com/tymondesigns/jwt-auth)实现JWT  这是非常好的,得到它的设置是很容易的。这是非常可配置的,这对我们来说是一个很好的奖励。如果你决定去同一条路线,你可以随时给我发消息,如果你需要一个例子。

 
shivamnetwork

@isaackearl 可以提供一个例子

 
dixitchopra
dixitchopra
2年前(11,310 XP)

@isaackearl您如何为两个不同的身份验证表(一个用于用户凭据,另一个用于管理凭据)实现JWT

 
isaackearl
isaackearl
2年前(26,350 XP)

@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);
    }
}

然后,您可以使用这个中间件来控制您的控制器,以确保它们先被认证。

这是从包中提供的默认内容中提取的。这不一定是我实现它,因为每个实现都有特定的需求。如果你有一个更具体的问题,我会尽力帮助。

 
isaackearl
isaackearl
2年前(26,350 XP)

@dixitchopra

你是否使用某种多重认证包?告诉我一些更多关于你已经拥有和你想完成什么,我会尽我所能给你一个答案。

我的初衷是告诉你将它全部放在一个表中,并使用角色来确定它是管理员还是普通用户。

那么再次,我意识到你可能会有一种情况,你真的想把它们保存在单独的表中,因为它们没有重叠的数据,然后他们都需要能够登录或类似的东西。

如果是这样,那么我可以推荐一些我以前做过的事情,但是我想了解一些关于你的情况的一些事情,然后我花了很多时间写出你可能不需要的例子。

 
dixitchopra
dixitchopra
2年前(11,310 XP)

@isaackearl

我没有使用Multi auth包。

我有两个实体/表 - 一个是商家和其他是客户。即使是商家用户也可以成为另一个商家的客户,所以email_id将是一样的,所以我没有保持相同的表格并在这里使用角色。根据不同的实体有不同的自定义声明。我正在寻找两个不同的表。

我已经实现了Sean在wiki中写的内容 - https://github.com/tymondesigns/jwt-auth/wiki,你在上面的回复中写过。一个实体/表可以正常工作。我被困在如何使用不同的实体。

 
isaackearl
isaackearl
2年前(26,350 XP)

@dixitchopra

那么这个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...


普通分类: