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

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

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

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

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);
}
6年前 评论
讨论数量: 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);
}
6年前 评论
liyu001989

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

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

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

6年前 评论
宇宙最厉害

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

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);
}
6年前 评论
zhangatle

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

6年前 评论
zhangatle

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

6年前 评论

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

6年前 评论
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());
        }
    }

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

6年前 评论

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

5年前 评论