我发现很难围绕密码授予身份验证过程。
我想要实现的目标:移动设备会将注册用户的用户名和密码发送给API,并以JSON格式获取访问令牌作为响应。
到目前为止我所取得的成就: API会收到用户凭据(用户名和密码),并使用Laravel的内置身份验证系统对用户进行身份验证。
我知道此时我应该进行Oauth身份验证。凭据通过Auth步骤后,我拥有用户的用户名,密码(在users
表中指定),我可以从{{client_id
和client_secret
获取oauth_clients
和{{1}} 1}}表,但我不知道如何完成剩下的工作。我是否需要再发一次POST请求?如果是,那么我该如何从控制器进行操作?
答案 0 :(得分:2)
我现在正在实施此目的。让我给你看一些代码。
这是我登录功能的一部分:
// this does the process for getting the access token
$oauth = AuthorizationServer::performAccessTokenFlow();
// some hacks
$oauth = (array) $oauth;
// more hacks
$oauth = json_decode($oauth["\0*\0data"], true);
// checks if a token was actually generated
if(!in_array('bearer', $oauth))
{
// returns what was generated if the token is missing
return Responser::error(400, $oauth);
}
除了用户的username
和password
之外,您必须在登录信息上发布其他数据。
所以你的帖子请求将包含:
username=the_username
password=the_password
grant_type=password
client_id=the_client_id
client_secret=the_client_secret
请注意grant_type=password
是常量。
现在您必须检查app/config/packages/lucadegasperi/oauth2-server-laravel/oauth2.php
处找到的包的配置:
您应该拥有以下代码:
'password' => array(
'class' => 'League\OAuth2\Server\Grant\Password',
'access_token_ttl' => 604800,
'callback' => function($username, $password){
$credentials = array(
// change this to username if username is the field on your database
'email' => $username,
'password' => $password,
);
$valid = Auth::validate($credentials);
if (!$valid) {
return false;
}
return Auth::getProvider()->retrieveByCredentials($credentials)->id;
}
),
你已经完成了。
<强>更新强>
生成令牌的上面代码在此函数中:
// allow user to login with username or email and password
$user_pass = array('username' => $username, 'password' => $password);
$email_pass = array('email' => $username, 'password' => $password);
// check if input is email and use $email_pass combination or else use $user_pass combination
$login = ($isEmail->passes() ? $email_pass : $user_pass);
// try to authenticate username & password
if (Auth::attempt($login))
{
// now you are authenticated here
// get the client id and secret from the database
// maybe use curl or some hacks
// login stuff and token generation
}
答案 1 :(得分:1)
这是一个旧帖子,但是如果你想要在没有多个帖子请求的情况下这样做,你总是可以做以下事情:
//Get Oauth creds
$apiCreds = OauthClient::where('name', Input::get('email'))->first();
//Provide additional post data for password grant
Input::merge([
'grant_type' => 'password',
'client_id' => $apiCreds->id,
'client_secret' => $apiCreds->secret,
'username' => Input::get('email'),
'password' => Input::get('password'),
'scope' => 'all'
]);
//Login
return AuthorizationServer::performAccessTokenFlow();