将 Laravel Passport 与移动应用程序一起使用

Posted

技术标签:

【中文标题】将 Laravel Passport 与移动应用程序一起使用【英文标题】:Using Laravel Passport with mobile application 【发布时间】:2017-11-12 05:33:09 【问题描述】:

我正在使用 laravel API 制作一个移动应用程序,我看到自 Laravel 5.3(?)以来,他们添加了一个名为“Passport”的东西,用于处理应用程序的 OAuth2/验证,所以我想我会尝试一下。在使用 Laravel Passport 文档 (https://laravel.com/docs/5.4/passport) 完成设置后,我遵循了几个不同的解释来说明如何让它工作。现在这是我根据其他教程/ SO 文章提出的代码

1.) 用于创建用户/oAuth2 客户端的控制器

class OAuthController extends Controller

    public function registerUser(Request $request)

    $email = $request->email;
    $password = $request->password;
    $name = $request->name;
    $user = User::create([
        'name' => $name,
        'email' => $email,
        'password' => bcrypt($password)
    ]);

    $oAuthClient = new OAuthClient();
    $oAuthClient->user_id = $user->id;
    $oAuthClient->id = $user->email;
    $oAuthClient->name = $user->name;
    $oAuthClient->secret = base64_encode(hash_hmac('sha256',$password, 'secret', true));
    $oAuthClient->password_client=1;
    $oAuthClient->redirect = '';
    $oAuthClient->personal_access_client = 0;
    $oAuthClient->revoked = 0;
    $oAuthClient->save();

    return response()->json(['message', 'User successfully created']);


2.) 我为引用 oauth_clients 表所做的模型

use Illuminate\Database\Eloquent\Model;

class OAuthClient extends Model

    protected $table = 'oauth_clients';
 

3.) 我将 oauth_clients 表的主键从递增整数更改为用户电子邮件。我基本上只是在关注这篇 SO 文章 Laravel Passport Password Grant Tokens: own mobile app

4.) 创建用户/oauth_client 后,通过 POSTMAN 检索令牌,并使用参数向 oauth/token 发送请求

问题是,这对我来说真的很不对劲。 oauth_clients 上有一个 user_id 列,所以它真的让我相信在尝试获取 oauth_client 令牌时,我应该能够执行一些发布请求,它将带用户然后获取关联的 oauth_client,对吗?

在我看来,我应该如何使用 Passport 为我的移动应用程序进行用户身份验证的意义如下: 1.) 注册新用户

2.) 注册用户时,为该用户创建 oauth_client

3.) 登录时,验证用户电子邮件/密码后,查找 oauth_client,然后检索 oath_client 令牌

4.) 对 API 的任何请求使用 oauth_client 令牌,然后再发送给经过验证的经过身份验证的用户。

这是正确的思考方式吗?我确信这很明显,但这个过程让我感到困惑,所以任何指导都将不胜感激。

【问题讨论】:

【参考方案1】:

好吧,如果有人有兴趣或有任何未来的建议,这就是我最终为使其正常工作所做的工作。

我为移动注册创建了一条新路线,

    Route::post('/mobile_register', 'Auth\RegisterController@mobileRegister');

然后我基本上只是复制了实际的注册方法,但添加了一个新函数来根据成功的用户注册信息创建一个新的 oauth_client

 /**
 * Register a new user through the mobile application. Send back the oauth_client ID which will be used
 * to retrieve the oauth token
 *
 * @param Request $request
 * @return \Illuminate\Http\JsonResponse
 */
public function mobileRegister(Request $request)

    $this->validator($request->all())->validate();

    $password = $request->password;
    event(new Registered($user = $this->create($request->all())));

    $oAuthClient = $this->registerOAuthClient($user, $password);

    return response()->json(['message' => 'user created successfully', 'client_id' => $oAuthClient->id]);


/**
 * Create the associated oauth_client for this user.
 *
 * @param User $user
 * @param $password
 * @return \Illuminate\Http\JsonResponse|OAuthClient
 */
public function registerOAuthClient(User $user, $password)

    $oAuthClient = new OAuthClient();
    $oAuthClient->user_id = $user->id;
    $oAuthClient->name = $user->name;
    $oAuthClient->secret = base64_encode(hash_hmac('sha256',whatever you want your secret to be based off of, 'secret', true));
    $oAuthClient->password_client=1;
    $oAuthClient->redirect = '';
    $oAuthClient->personal_access_client = 0;
    $oAuthClient->revoked = 0;
    if(!$oAuthClient->save())
        return response()->json(['error' => 'Unable to create oAuthClient! User will need one made to access website']);

    return $oAuthClient;

所以现在新的 oAuthClient ID 将被发送回移动应用程序,然后在您的移动应用程序内部,您可以创建需要发送的“client_secret”以获取 oauth 令牌,您可以使用发送的 client_id在您的 oauth/token 发布请求中作为“client_id”从 API 返回。然后,您将发送您的第二个发布请求以检索用户的实际 oauth 令牌。

我觉得这是最好的,因为那时我不需要在应用程序上存储任何敏感的用户信息,即使我发送回客户端 ID,除非某些邪恶的一方知道你将要使用什么client_secret' 也是如此,他们无法访问您的 oauth 客户端以检索令牌。他们也不会知道您的用户,因此他们无法从您的用户那里确定您的 oauth 客户端。 我也喜欢这个解决方案,因为我仍在验证用户是否存在,并且在对 oauth_client 信息进行第二次验证之前 pw 是正确的。

免责声明::这是我第一次尝试使用 Passport 或真正进行任何类型的身份验证,所以这肯定有问题。如果你看到任何,请评论或发布让我知道!我想确保它尽可能好,因此我将不胜感激!

【讨论】:

您好先生,您是使用inAppBrowser打开/mobile_register路由吗?

以上是关于将 Laravel Passport 与移动应用程序一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport 密码授予刷新令牌

Laravel 通过 Passport 实现 API 请求认证:移动端应用篇(密码授权令牌)

Laravel Passport:发送令牌请求时的附加模型条件

问题理解 Laravel 6.0 Passport with Password Grant Tokens 流程

为啥客户凭证应该与 Laravel Passport 中的用户相关联?

Laravel 5.3 Passport - Vue 错误:评估表达式时出错