Laravel Passport API 注册新用户

Posted

技术标签:

【中文标题】Laravel Passport API 注册新用户【英文标题】:Laravel Passport API registering new users 【发布时间】:2018-10-24 03:11:37 【问题描述】:

我正在尝试为我的网络应用程序构建登录系统,但我无法让 Passport 工作。该应用程序是作为 REST API 构建的,因此用户应该能够使用电子邮件和密码进行注册,之后他们应该能够使用这些凭据登录(所以我认为他们需要从 Passport 接收访问令牌时登录凭据正确)。

我以为我可以只向“注册”路由发布 JSON 以注册新用户,然后向“登录”路由发布以将访问令牌返回给客户端,但没有这样的事情据我所知。

如何注册新用户?

【问题讨论】:

【参考方案1】:

如果您正在构建 SPA 并使用默认 Laravel 注册、登录、忘记密码和重置密码 Web 功能(如 Google Account)进行身份验证和授权,您可以使用重定向逻辑覆盖 App\Http\Controllers\Auth\RegisterController.php 上的注册方法网址是存在的。

这行告诉 Laravel 在导航到 Web 注册控制器重定向路径之前查看预期的 url。

   /**
     * The user has been registered.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  mixed  $user
     * @return mixed
     */
    protected function registered(Request $request, $user)
    
        if ($request->session()->has('url.intended')) 
            return redirect()->intended();
        
    

例如,我在我的 Vue.js SFC 上使用带有 PKCE 授权的授权代码

<template>
  <v-app-bar app flat>
    <button-login @login="authorize"></button-login>

    <span>|</span>

    <button-register @register="authorize"></button-register>
  </v-app-bar>
</template>

<script>
import ButtonLogin from '@/components/Buttons/ButtonLogin'
import ButtonRegister from '@/components/Buttons/ButtonRegister'
import  base64URL, encrypt, hashMake, randomString  from '@/helpers'
import sha256 from 'crypto-js/sha256'
import httpBuildQuery from 'http-build-query'
import  SERVICE  from '@/config/services'
import  STORAGE_API_AUTHORIZATION_STATE, STORAGE_API_CODE_VERIFIER  from '@/config/storage'

export default 
  name: 'AppBar',

  components: 
    ButtonLogin,
    ButtonRegister
  ,

  authorize() 
      const authorizationState = randomString(40)

      const codeVerifier = randomString(128)

      const codeChallenge = base64URL(sha256(codeVerifier))

      const query = httpBuildQuery(
        client_id: SERVICE.CLIENT_ID,
        redirect_uri: authorizationURL,
        response_type: 'code',
        scope: '*',
        state: authorizationState,
        code_challenge: codeChallenge,
        code_challenge_method: 'S256'
      )

      localStorage.setItem(
        STORAGE_API_AUTHORIZATION_STATE,
        hashMake(authorizationState)
      )

      localStorage.setItem(
        STORAGE_API_CODE_VERIFIER,
        encrypt(codeVerifier, authorizationState)
      )

      location.href = `$SERVICE.API_URL/oauth/authorize?$query`
    

</script>

每当用户点击我的 SPA 上的登录/注册按钮时,它都会重定向到我的 API OAuth 授权页面。

身份验证中间件会拦截请求并检查用户的登录状态,如果用户未通过身份验证,则会将用户重定向到登录页面。

如果用户选择通过点击注册按钮来注册他/她的帐户,我们会将用户重定向到网络注册页面(仍然在 API 上而不是在 SPA 上)。

用户注册后,控制器将调用注册方法并检查预期的URL是否存在,如果存在则我们能够将用户重定向到预期的url(oauth/authorize端点),并且可以继续授权过程在注册过程之后。

【讨论】:

【参考方案2】:

我在这里遇到了同样的问题,到目前为止,我发现的最佳解决方案是通过创建 UserController 和这样的 store 方法手动创建 register 方法

public function store(Request $request) 
    $data=$request->only('name', 'email','password');
            $valid = validator(
                    $data, [
                'name' => 'required|string|max:255',',
                'email' => 'required|string|email|max:155|unique:users',
                'password' => 'required|string|min:4',
            ]);

            $return=null;
            if ($valid->fails()) 
                $return = response()->json($valid->errors()->all(), 400);

            else
                $data['password']=Hash::make($data['password']);
                #return = User::create($data);
                    
            return $return;

【讨论】:

以上是关于Laravel Passport API 注册新用户的主要内容,如果未能解决你的问题,请参考以下文章

Laravel passport认证

laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

Laravel Passport 注册用户凭据不正确

Laravel 5.5 - Laravel Passport 使用正确的授权类型?

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

Laravel 通过 Passport 实现 API 请求认证:第三方应用篇(授权码获取令牌)