作为OAuth2协议的一部分,通过返回_url将用户重定向回应用程序

qacovj5a  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(168)

在spring Boot 上使用后端,在angular上使用前端,在nginx上使用Web服务器。
当用户在进入网站时通过第三方服务选择授权方法时,他被重定向到该服务,在那里他输入他的登录名和密码,然后该服务为用户提供所请求的数据。此时,他必须被重定向回该网站,并且他应该在他的个人帐户中。
如何实现return_url,使用户正确出现在我的网站上,然后,从URL浏览器行,有可能读取由第三方服务提供的授权码,添加到我的redirect_url?
我在spring Boot 中做了这样一个控制器:

@RestController
@RequestMapping("/callback/")
public class ServiceReturnController {

    @GetMapping(path = "service_return", produces = "text/plain")
    public ResponseEntity<?> handleReturn(
            @RequestParam(name = "code", required = false) String authCode,
            @RequestParam(name = "error", required = false) String error,
            @RequestParam(name = "error_description", required = false) String errorDescription
    ) {
        StringJoiner joiner = new StringJoiner("\n\n");
        if (StringUtils.hasText(error)) {
            joiner.add("error=" + error);

        }
        if (StringUtils.hasText(errorDescription)) {
            joiner.add("error_description=" + errorDescription);
        }

        if (joiner.length() != 0) {
            joiner.add("No expected parameters received.");
            return ResponseEntity.ok().body(joiner.toString());
        }
        return ResponseEntity.ok().build();
    }
}

我这样设置retun_url:https://exampleMyApp.com/callback/service_return
我的配置nginx,这里是我的控制器在Spring Boot 的路线:

location /callback/{
proxy_pass http://exampleMyApp-API.ru:9089/callback/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 500m;
}

成功认证后,用户应该在我的网站的个人帐户中。但是为此,前端必须从URL中读取授权码,并发出另一个请求以获得访问令牌并使用它访问网站
网址:http://exampleMyApp.com/callback/service_return?code=eyJ2ZXIiOjEsInR5cCI6IkpXVCIsInNidCI6ImF1dGhvcml6&state=wvwwvw-wevwvw-wew
怎么做的?也许我有一些缺陷。建议如何重定向到网站,并在验证访问令牌后执行额外的请求。

frebpwbc

frebpwbc1#

您可以通过订阅ActivatedRoute来访问当前路由上的查询参数。使用params.get(<PARAM_NAME>),您可以获得参数字符串value或undefined。
使用收到的代码和状态调用后端。在后端检查状态并将代码交换为访问令牌。
根据代码交换的结果向前端发送响应。
Angular代码:

import {ActivatedRoute} from '@angular/router'
import {exhaustMap, noop, switchMap, take} from "rxjs";
....

@Component({
    selector: 'app-callback',
    ...
})
export class CallbackComponent {
    
    constructor(
        private readonly route: ActivatedRoute,
        // your serivce for calling your backend
        private readonly exchangeService: ExchangeService
    ) {
        // get the current route params
        void route.queryParams.pipe(
            switchMap((params: Params)) => {
                // get the code
                const code = params.get('code')
                // get the state
                const state = params.get('state')

                // exchange the code for a token on your backend
                return this.exchangeService.exchangeCode(code, state).pipe(
                    exhaustMap(result => {
                        // handle your backend response here
                        ...
                    })
                )
            }),
            take(1)
        ).subscribe(noop)
    }
}

相关问题