client_secret 泄露的问题,怎么不让用户看到?

做前后端分离,前端为WEB页面,用户只要一审查元素,就可以看到client_secret,那么这个client_secret存在的意义是什么?

zhangatle
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
宇宙最厉害
最佳答案

你可以只传入用户名密码,在控制器里面多做个请求。

try {
    $response = $http->post(config('app.url') . '/oauth/token', [
        'headers' => [
            'Accept' => $request->header('accept')
        ],
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => config('setting.client_id'),
            'client_secret' => config('setting.client_secret'),
            'username' => $request->username,
            'password' => $request->password,
            'scope' => '*',
        ],
    ]);
} catch (\GuzzleHttp\Exception\ClientException $e) {
    return $e->getResponse();
}

if ($response->getStatusCode() !== 200) {
    return json_decode((string) $response->getBody(), true);
}
5年前 评论
讨论数量: 7
宇宙最厉害

你可以只传入用户名密码,在控制器里面多做个请求。

try {
    $response = $http->post(config('app.url') . '/oauth/token', [
        'headers' => [
            'Accept' => $request->header('accept')
        ],
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => config('setting.client_id'),
            'client_secret' => config('setting.client_secret'),
            'username' => $request->username,
            'password' => $request->password,
            'scope' => '*',
        ],
    ]);
} catch (\GuzzleHttp\Exception\ClientException $e) {
    return $e->getResponse();
}

if ($response->getStatusCode() !== 200) {
    return json_decode((string) $response->getBody(), true);
}
5年前 评论
liyu001989

首先你理解一下 oauth 2.0 的两种模式 https://learnku.com/courses/laravel-advanc...

自己的服务器和客户端做账户验证,如果你一定要使用 passport 那么就是密码模式,密码模式就是这么用,泄露了也没影响,毕竟用户还需要提交自己的用户名和密码。

所以仅仅是为了一个 token 问题 而使用 passport 会比较麻烦,这就是为什么大多数人都在使用 jwt 而不是 passport

5年前 评论
宇宙最厉害

你可以只传入用户名密码,在控制器里面多做个请求。

try {
    $response = $http->post(config('app.url') . '/oauth/token', [
        'headers' => [
            'Accept' => $request->header('accept')
        ],
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => config('setting.client_id'),
            'client_secret' => config('setting.client_secret'),
            'username' => $request->username,
            'password' => $request->password,
            'scope' => '*',
        ],
    ]);
} catch (\GuzzleHttp\Exception\ClientException $e) {
    return $e->getResponse();
}

if ($response->getStatusCode() !== 200) {
    return json_decode((string) $response->getBody(), true);
}
5年前 评论
zhangatle

@liyu001989 嗯,谢谢回答,就是在这里有点顾虑,之前用的JWT,然后在研究passport的时候,把client_secret写在了env配置文件里面

5年前 评论
zhangatle

@沈益飞 之前用passport的时候就是这么做的,谢谢回答

5年前 评论

@zhangatle @liyu001989 其实写到env中是不对的,不同的客户端就应该使用不同client_id和client_secret,但是我的疑问是客户端怎么获取这个client_id和client_secret,如果都用一个client_id 感觉是误用了

5年前 评论
public function store(AuthorizationRequest $originRequest, AuthorizationServer $server, ServerRequestInterface $serverRequest)
    {
        if (empty($originRequest->grant_type)) {
            $parsedBody = $serverRequest->getParsedBody();
            $parsedBody['grant_type'] = 'password';
            $parsedBody['client_id'] = config('mars.oauth.client_id');
            $parsedBody['client_secret'] = config('mars.oauth.client_secret');
            $serverRequest = $serverRequest->withParsedBody($parsedBody);
        }

        try {
            return $server->respondToAccessTokenRequest($serverRequest, new Psr7Response)->withStatus(201);
        } catch (OAuthServerException $e) {
            return $this->response->errorUnauthorized($e->getMessage());
        }
    }

干脆这样,但是风险大家还需考虑考虑啊。

5年前 评论

在后端转发一遍就好了,前端就不用传那些参数

4年前 评论

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