将Laravel Passport与移动应用程序配合使用

时间:2017-06-10 07:13:49

标签: laravel api oauth-2.0 laravel-passport

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

得出的代码

1。)用于创建user / 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表primarykey从递增整数更改为用户电子邮件。我基本上只是关注这篇SO文章 Laravel Passport Password Grant Tokens: own mobile app

4.。)一旦我创建了user / oauth_client,通过POSTMAN检索令牌w / post请求带有参数的oauth / token

enter image description here

问题是,这对我来说真的很不对劲。 oauth_clients上有一个user_id列,所以它真的让我相信在尝试获取oauth_client令牌时我应该能够做一些帖子请求,它会占用用户,然后获取相关的oauth_client,对吧?

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

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

3.。)登录时,一旦验证用户email / pw,查找oauth_client然后检索oath_client令牌

4.。)对API的任何请求使用oauth_client令牌,以便经过验证的经过身份验证的用户。

这是想到它的正确方法吗?我确信这很明显,但这个过程让我感到困惑,所以任何指导都会受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

好的,所以,任何人都有兴趣或有任何未来的建议,这就是我最终做的工作。

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

    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令牌,并且您可以使用从API发回的client_id作为' client_id'在你的oauth / token post请求中。然后,您将发送第二个发布请求以检索用户的实际oauth令牌。

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

免责声明::这是我第一次尝试使用Passport或者真正进行任何类型的身份验证,所以它确实存在问题。如果您发现任何问题,请发表评论或发布以告诉我们!我想确保它尽可能好,所以我将非常感激!