laravel 小程序段登录流程问题

想实现功能:通过小程序code换取unionid,根据unionid查询用户是否存在,不存在则注册后登录,(到这是没问题的),
问题一:我是无账号无密码无登陆页面,只能查到用户信息,这种方式怎么登录
(laravelacademy.org/post/9752), 教程中也有登录的流程,登录流程是一句话概括的,所以不知道如何去实现
问题二:如何通过下图这种方式发放token
问题一解决后登录成功 想用passport中的授权码形式发放token
auth.php配置
laravel  小程序段登录流程问题

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

我觉得你应该是需要这个jwt-auth.readthedocs.io/en/develop... jwt了解一下。

1年前 评论
HinataiLiang (楼主) 1年前
HinataiLiang (楼主) 1年前
HinataiLiang (楼主) 1年前
joker_hu (作者) 1年前
讨论数量: 18
抄你码科技有限公司
1年前 评论
HinataiLiang (楼主) 1年前
lvjie1996 1年前
chowjiawei

traits PassportToken.php

<?php

namespace App\Traits;

//这里请引用自己的User Model
use App\Models\Users\User;
use DateTime;
use GuzzleHttp\Psr7\Response;
use Illuminate\Events\Dispatcher;
use Laravel\Passport\Bridge\AccessToken;
use Laravel\Passport\Bridge\AccessTokenRepository;
use Laravel\Passport\Bridge\Client;
use Laravel\Passport\Bridge\RefreshTokenRepository;
use Laravel\Passport\Bridge\Scope;
use Laravel\Passport\Passport;
use Laravel\Passport\TokenRepository;
use League\OAuth2\Server\CryptKey;
use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
use League\OAuth2\Server\Exception\OAuthServerException;
use League\OAuth2\Server\Exception\UniqueTokenIdentifierConstraintViolationException;
use League\OAuth2\Server\ResponseTypes\BearerTokenResponse;

/**
 * Trait PassportToken
 *
 * @package App\Traits
 */
trait PassportToken
{
    /**
     * Generate a new unique identifier.
     *
     * @param int $length
     *
     * @throws OAuthServerException
     *
     * @return string
     */
    private function generateUniqueIdentifier($length = 40)
    {
        try {
            return bin2hex(random_bytes($length));
            // @codeCoverageIgnoreStart
        } catch (\TypeError $e) {
            throw OAuthServerException::serverError('An unexpected error has occurred');
        } catch (\Error $e) {
            throw OAuthServerException::serverError('An unexpected error has occurred');
        } catch (\Exception $e) {
            // If you get this message, the CSPRNG failed hard.
            throw OAuthServerException::serverError('Could not generate a random string');
        }
        // @codeCoverageIgnoreEnd
    }

    private function issueRefreshToken(AccessTokenEntityInterface $accessToken)
    {
        $maxGenerationAttempts = 10;
        $refreshTokenRepository = app(RefreshTokenRepository::class);

        $refreshToken = $refreshTokenRepository->getNewRefreshToken();
        $refreshToken->setExpiryDateTime((new \DateTimeImmutable())->add(Passport::refreshTokensExpireIn()));
        $refreshToken->setAccessToken($accessToken);

        while ($maxGenerationAttempts-- > 0) {
            $refreshToken->setIdentifier($this->generateUniqueIdentifier());
            try {
                $refreshTokenRepository->persistNewRefreshToken($refreshToken);

                return $refreshToken;
            } catch (UniqueTokenIdentifierConstraintViolationException $e) {
                if ($maxGenerationAttempts === 0) {
                    throw $e;
                }
            }
        }
    }

    protected function createPassportTokenByUser(User $user, $clientId)
    {
        $accessTokenRepository = new AccessTokenRepository(new TokenRepository(), new Dispatcher());
        $accessToken = $accessTokenRepository->getNewToken(new Client($clientId, null, null), [new Scope("*")], $user->id);
        $accessToken->setIdentifier($this->generateUniqueIdentifier());
        $accessToken->setClient(new Client($clientId, null, null));
        $accessToken->setExpiryDateTime((new \DateTimeImmutable())->add(Passport::tokensExpireIn()));
        $accessTokenRepository->persistNewAccessToken($accessToken);
        $refreshToken = $this->issueRefreshToken($accessToken);


        return [
            'access_token' => $accessToken,
            'refresh_token' => $refreshToken,
        ];
    }

    protected function sendBearerTokenResponse($accessToken, $refreshToken)
    {
        $response = new BearerTokenResponse();
        $response->setAccessToken($accessToken);
        $response->setRefreshToken($refreshToken);
        $privateKey = new CryptKey('file://'.Passport::keyPath('oauth-private.key'), null, false);

        $accessToken->setPrivateKey($privateKey);
        $response->setPrivateKey($privateKey);
        $response->setEncryptionKey(app('encrypter')->getKey());
        return $response->generateHttpResponse(new Response);
    }

    /**
     * @param User $user
     * @param $clientId
     * @param bool $output
     * @return mixed|\Psr\Http\Message\ResponseInterface
     */
    protected function getBearerTokenByUser(User $user, $clientId, $output = true)
    {
        $passportToken = $this->createPassportTokenByUser($user, $clientId);
        $bearerToken = $this->sendBearerTokenResponse($passportToken['access_token'], $passportToken['refresh_token']);
        if (! $output) {
            $bearerToken = json_decode($bearerToken->getBody()->__toString(), true);
        }

        return $bearerToken;
    }
}


使用

public function noPasswordGetAccessToken($userId)
    {
        $user=User::find($userId);
        return  $this->getBearerTokenByUser($user, config('passport.get_token_client'), false);
    }
1年前 评论
HinataiLiang (楼主) 1年前
chowjiawei (作者) 1年前
chowjiawei (作者) 1年前

这种推荐使用 sanctum

1年前 评论
mouyong

laravel-workerman.iwnweb.com/d/28 小程序用户登录流程

1年前 评论

我觉得你应该是需要这个jwt-auth.readthedocs.io/en/develop... jwt了解一下。

1年前 评论
HinataiLiang (楼主) 1年前
HinataiLiang (楼主) 1年前
HinataiLiang (楼主) 1年前
joker_hu (作者) 1年前

我是通过中间件登录的,前台传过来token解析用户, Auth::loginUsingId($user_token->users_id);登录

1年前 评论

如果使用 easy-wechat 的话

$jsCode = $request->input('code');
$iv = $request->input('iv');
$encryptedData = $request->input('encrypted_data');

// 获取用户 session,通过前端传过来的 code 获取 unionid。
$mp = Factory::miniProgram($config);
$mpUser = $mp->auth->session($jsCode);

// 解密获取用户信息
$userData = $mp->encryptor->decryptData($mpUser['session_key'], $iv, $encryptedData);

// 创建或者查找用户
$check = [
        'openid'    => $mpUser['openid'],
        'union_id'  => $mpUser['unionid']
];
$data = [
        'openid'    => $mpUser['openid'],
        'union_id'  => $mpUser['unionid'],
        'gender'    => $userData['gender'],
        'nickname'  => $userData['nickName'],
        'avatar'    => $userData['avatarUrl'],
];
$user = User::firstOrCreate($check, $data);

// 授权,返回用户 token
$token = Auth::login($user);
return $this->response([
        'access_token'  => $token,
        'token_type'    => 'Bearer',
        'expires_in'    => Auth::factory()->getTTL()
]);

注册-创建用户
登录-让用户可以访问需要授权的接口

1年前 评论

我是直接用jwt的,放入header里面就行了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!