首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在react中使用typescript在NSwag生成的服务中注入JWT

如何在react中使用typescript在NSwag生成的服务中注入JWT
EN

Stack Overflow用户
提问于 2019-09-09 04:19:02
回答 1查看 345关注 0票数 3

我正在使用NSwag Studio在react中使用typescript生成服务类。以下是生成的代码的示例:

代码语言:javascript
运行
复制
export class BookingClient {
    private http: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> };
    private baseUrl: string;
    protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;

    constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) {
        this.http = http ? http : <any>window;
        this.baseUrl = baseUrl ? baseUrl : "";
    }

    getMarinaData(model: MarinaDataRequest): Promise<MarinaDataResponse> {
        let url_ = this.baseUrl + "/api/booking/marina/data";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(model);

        let options_ = <RequestInit>{
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json", 
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetMarinaData(_response);
        });
    }

    protected processGetMarinaData(response: Response): Promise<MarinaDataResponse> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            result200 = _responseText === "" ? null : <MarinaDataResponse>JSON.parse(_responseText, this.jsonParseReviver);
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<MarinaDataResponse>(<any>null);
    }
}

我的问题是,如何为受保护的端点添加或注入JWT。假设并非所有端点都受到保护。感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-09-18 09:50:01

创建一个基类并覆盖transformOptions方法。

代码语言:javascript
运行
复制
export class BaseClass {

    protected transformOptions = async (options: RequestInit): Promise<RequestInit> => {
        let token = getToken(); // your custom logic to get the token

        options.headers = {
            ...options.headers,
            Authorization: 'Bearer ' + token,
        };
        return Promise.resolve(options);
    };
}

在你的nswag.json集合中:

代码语言:javascript
运行
复制
"clientBaseClass": "BaseClass",
"extensionCode": "path/to/your/BaseClass.ts",
"useTransformOptionsMethod": true,

这会将其添加到所有端点,但我认为将令牌发送到未受保护的端点并无坏处(它将被忽略)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57845469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档