Angular - oidc-client为每个REST API调用发送/授权请求

时间:2018-04-07 07:53:50

标签: angular oauth-2.0 openid identityserver4 oidc-client-js

我目前正在使用 SPA客户端设置身份服务器,并使用一些REST服务来使用来自的数据。

一切似乎都有效但我目前很难理解,为什么每个带有效/authorize的API调用都会触发对身份服务器的HttpClient端点的请求。

登录页面上的按钮

此按钮只是通过@angular/common/http

中的/login实例调用我的REST API

这些按钮位于我的/login/callback页面上。

身份服务器的回调设置为/authorize

enter image description here

请求/authorize端点

每次点击该按钮都会向302端点发送请求,因此会将http /login/callback重定向到access_token页面。

请求仍然存在并且一切正常但是总会发生这种重定向。

我原本预计如果有效AccessTokenInterceptor,这个请求是否有必要?

enter image description here

enter image description here

AccessToken Interceptor

OidcService内,我打电话给UserManagergetUser()可以访问oidc-client库中的UserManager

由于某些原因,/authorize上涉及access_token的每个请求都会触发此@Injectable() export class AccessTokenInterceptor implements HttpInterceptor { constructor(private oidcService: OidcService) { } intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return this.oidcService.getUser() .mergeMap((user: User) => { if (user) { request = request.clone({ setHeaders: { Authorization: `Bearer ${user.access_token}` } }); } return next.handle(request); }); } } 请求,即使OPTIONS仍然有效。我在这里错过了什么?

/authorize

我感谢您提供任何帮助,如果您需要更多代码示例,请与我们联系。

更新1

我打电话给#34;致电Api&#34;按钮,发出以下三个请求。

  1. 302请求我的REST API。
  2. GET请求(最终返回http { "authority": "https://localhost:44327", "client_id": "webClient", "response_type": "id_token token", "scope": "openid testclientapi testclientapi.read testclientapi.write", "redirect_uri": "http://localhost:4200/login/callback", "post_logout_redirect_uri": "http://localhost:4200/logout/callback", "silent_redirect_uri": "http://localhost:4200/login/silentLogin", "automaticSilentRenew": true, "monitorSession": true, "revokeAccessTokenOnSignout": true, "loadUserInfo": true } 并执行我想避免的重定向)
  3. new Client { ClientId = "webClient", ClientName = "myclient", AllowedGrantTypes = GrantTypes.Implicit, AccessTokenType = AccessTokenType.Reference, AccessTokenLifetime = 60 * 60, IdentityTokenLifetime = 30, RequireConsent = false, AllowOfflineAccess = true, AllowAccessTokensViaBrowser = true, ClientSecrets = { new Secret("XYZ) }, AllowedCorsOrigins = new string[] { "http://localhost:4200", }, RedirectUris = { "http://localhost:4200/login/callback", "http://localhost:4200/login/silentLogin", "http://localhost:4200/logout/callback", }, PostLogoutRedirectUris = { "http://localhost:4200/logout/callback", }, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, "testclientapi", "testclientapi.read", "testclientapi.write" } } }; 请求我打算做什么。
  4. enter image description here

    enter image description here

    enter image description here

    更新2

    Web应用程序 - UserManagerSettings

    getUser() : Observable<User> {
        return Observable.fromPromise(this.userManager.getUser())
      }
    

    Identity Server - 客户端配置

    import sys
    import os
    from select import select
    
    # -------------------------------------------------------------------------    
    # Set the pipe (fake stdin) to simulate a final key stroke
    # which will unblock the select statement
    readEnd, writeEnd = os.pipe()
    readFile = os.fdopen(readEnd)
    writeFile = os.fdopen(writeEnd, "w")
    
    # -------------------------------------------------------------------------
    def getKey():
    
        # Wait for stdin or pipe (fake stdin) to be ready
        dr,dw,de = select([sys.__stdin__, readFile], [], [])
    
        # If stdin is the one ready then read it and return value
        if sys.__stdin__ in dr:
            return sys.__stdin__.read(1)   # For Windows use ----> getch() from module msvcrt
    
        # Must finish
        else:
            return None
    
    # -------------------------------------------------------------------------
    def breakStdinRead():
        writeFile.write(' ')
        writeFile.flush()
    
    # -------------------------------------------------------------------------
    # MAIN CODE
    
    # Get key stroke
    key = getKey()
    
    # Keyboard input
    if key:
        # ... do your stuff with the key value
    
    # Faked keystroke
    else:
        # ... use of stdin finished
    
    # -------------------------------------------------------------------------
    # OTHER THREAD CODE
    
    breakStdinRead()
    

    更新3

    {{1}}

1 个答案:

答案 0 :(得分:0)

我找到了这个问题的临时解决方法。

一旦我没有从我的/login路由触发REST API请求,而是从其他位置/admin触发REST API请求,它就像魔术一样。

最终没有向/authorize端点发送任何请求。

一旦我弄清楚为什么会发生这种情况,我会更新这个答案。

REST API Request

更新1

我在执行/logout请求时遇到了类似问题 - 还必须将其移至完整的其他路线......