Laravel - Oauth密码授予

时间:2014-04-24 20:40:03

标签: laravel oauth-2.0

我发现很难围绕密码授予身份验证过程。

我想要实现的目标:移动设备会将注册用户的用户名和密码发送给API,并以JSON格式获取访问令牌作为响应。

到目前为止我所取得的成就: API会收到用户凭据(用户名和密码),并使用Laravel的内置身份验证系统对用户进行身份验证。

我知道此时我应该进行Oauth身份验证。凭据通过Auth步骤后,我拥有用户的用户名,密码(在users表中指定),我可以从{{client_idclient_secret获取oauth_clients和{{1}} 1}}表,但我不知道如何完成剩下的工作。我是否需要再发一次POST请求?如果是,那么我该如何从控制器进行操作?

2 个答案:

答案 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);
}

除了用户的usernamepassword之外,您必须在登录信息上发布其他数据。

所以你的帖子请求将包含:

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();