php 接入扣子的 token获取

本身逻辑只是个api,但是官方不提供php的sdk 扎心了老铁,这下php 狗都不用了,主要麻烦的是如何获取access_token,代码如下

    protected function get_jwt(): string
    {
        $header = [
            'alg' => 'RS256',
            'typ' => 'JWT',
            'kid' => $this->kid
        ];
        $payload = [
            'iss' => $this->iss,
            'aud' => $this->aud,
            'iat' => time(),
            'exp' => time() + $this->duration * 60,
            'jti' => Str::random(32),
        ];
        $encodedHeader = $this->base64url_encode(json_encode($header));
        $encodedPayload = $this->base64url_encode(json_encode($payload));
        $signature = '';
        $data = $encodedHeader . '.' . $encodedPayload;

        openssl_sign($data, $signature, Storage::get('private_key.pem'), 'sha256WithRSAEncryption');
        $encodeSignature = $this->base64url_encode($signature);
        return $encodedHeader . '.' . $encodedPayload . '.' . $encodeSignature;
    }

    private function base64url_encode($data)
    {
        return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    }
### 如何确保扣子智能体的访问令牌不过期 为了确保扣子智能体的 `access_token` 不会过期,可以采取以下几种方法来延长其有效期并实现无缝续接: #### 使用 Refresh Token 刷新 Access Token 当初始获取到 `access_token` 和 `refresh_token` 后,在 `access_token` 即将到期前,可以通过发送特定请求利用 `refresh_token` 来重新获取新的 `access_token`。这种方式无需再次让用户参与授权流程即可更新令牌。 以下是通过 HTTP 请求刷新 `access_token` 的通用方式[^1]: ```http POST /oauth/token HTTP/1.1 Host: authorization-server.com Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&refresh_token=EXISTING_REFRESH_TOKEN ``` 成功响应通常如下所示: ```json { "access_token": "NEW_ACCESS_TOKEN", "expires_in": 3600, "token_type": "Bearer" } ``` #### 定时轮询机制 开发人员可以在后台设置定时器或调度程序定期检查当前 `access_token` 是否即将失效(例如剩余时间少于一定阈值),如果接近失效,则自动触发上述基于 `refresh_token` 的刷新逻辑。这种方法能够有效减少因 token 过期而导致的服务中断风险。 另外需要注意的是,部分 OAuth 实现可能对同一个用户的多个活跃 session 设置了互斥策略,因此频繁调用 refresh 可能会影响其他地方登录状态,请仔细阅读具体 API 文档说明。 #### 存储 Cookies 或 Session ID 维持长期连接 除了管理 tokens 外,还可以借助 cookies 中存储的信息比如 session id ,让浏览器保持长时间记忆客户端身份验证信息 。这样即使短暂丢失 access token ,也可以依靠 cookie 数据快速恢复认证上下文而不需要完全重做整个 Oauth 流程. 然而值得注意的是,仅依赖此手段并不安全可靠因为一旦这些持久化标识被盗取就可能导致账户被冒充攻击等问题发生所以最好还是结合前面提到的方法综合考虑安全性与便利性的平衡点. ```python import requests def refresh_access_token(client_id, client_secret, refresh_token): url = 'https://authorization-server.com/oauth/token' payload = { 'grant_type': 'refresh_token', 'client_id': client_id, 'client_secret': client_secret, 'refresh_token': refresh_token } response = requests.post(url, data=payload) if response.status_code == 200: new_tokens = response.json() return new_tokens['access_token'], new_tokens.get('expires_in') else: raise Exception(f"Failed to refresh token: {response.text}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值