Forum Discussion

Sriraj's avatar
Sriraj
Contributor
8 years ago

Auto Token Generation for OAuth2.0

Hi ,

 

I have couple of application profiles something like in the attachment.

 

Each of these are API connection profiles for different applications calling the API via a Gateway. They use OAuth 2.0 with different client credentials.

 

In my E2E suite i use all of these profiles and i end up generating these token manually every time before i run my E2E suite .

 

Is there an option in ReadyAPI where it it generates these tokens automatically ? Say every 30mins 

  • New2API's avatar
    New2API
    Frequent Contributor

    Hi Sriraj, I was also ran into similar issue and one of the community member helped with groovy method. In my example I have only one Auth profile but I could have  multiple in future.

     

    Implementation:

    I used this in event handler - TestRunListener.beforeRun - by doing this, script is checking at the beginning of a testcase if token is expired or not. if expired then retrieves from the server.

     

    Script:

     

    import com.eviware.soapui.impl.rest.actions.oauth.OltuOAuth2ClientFacade
    import com.eviware.soapui.support.editor.inspectors.auth.TokenType
    import com.eviware.soapui.impl.rest.OAuth2Profile.*



    //Get Project
    def project = testRunner.testCase.testSuite.getProject()

    //Get oAuth Profile Name
    def oAuthProfilelist = project.getOAuth2ProfileContainer().getOAuth2ProfileNameList()
    def oAuthProfileName

    if(oAuthProfilelist.size() == 1){
    oAuthProfileName = oAuthProfilelist[0]
    log.info "oAuth Profile name is: $oAuthProfileName"
    }

    //Get Token Status
    def oAuthProfile = project.getAuthRepository().getEntry("$oAuthProfileName")
    def TokenStatus = oAuthProfile.accessTokenStatus.toString()
    log.info "Access Token Status is: $TokenStatus"


    //Get Access Token from the server if expired
    if (TokenStatus != 'RETRIEVED_FROM_SERVER'){
    def oAuthClientFacade = new OltuOAuth2ClientFacade(TokenType.ACCESS)
    oAuthClientFacade.requestAccessToken(oAuthProfile, true)
    log.info "Access Token Status is "+ oAuthProfile.accessTokenStatus
    }

     

    since you have multiple profiles, you could iterate through them and update token.

     

    Hope this helps!

    • Sriraj's avatar
      Sriraj
      Contributor

      New2API Ideally if your script works at test step level , It must work for me as well. Let me give it a try.

      • New2API's avatar
        New2API
        Frequent Contributor

        Sriraj, give it a try. Currently it works like charm for me. Just one correction - this scripts runs just before a testcase as my event handler is TestRunListener.beforeRun. 

         

        thanks!

    • jameseg3's avatar
      jameseg3
      New Contributor

      Is this still working for you?  I'm seeing that AuthRepository is missing from the API docs.  Looks like a lot of this has been deprecated.  Have you found a work-around?  (I can't even use the getAuthRepository() method).

       

      Thanks in advance, 

       

      -James

      • New2API's avatar
        New2API
        Frequent Contributor

        Hi James, I am still using the same script and it works perfectly. Currently, I am on ReadyAPI 2.2.

        Also, I do see Auth Repository tab under Auth Manager section.

         

        What's version of SoapUI you are running?

         

        for OS version, there is a small change:

        import com.eviware.soapui.impl.rest.actions.oauth.OltuOAuth2ClientFacade
        import com.eviware.soapui.impl.rest.OAuth2Profile.*
        
        //Get Project
        def project = testRunner.testCase.testSuite.getProject() 
        
        //Get oAuth2 Profile Name
        def authContainer
        def oAuthProfilelist
        def oAuthProfile 
        def oAuthProfileName
        def TokenStatus
        def oAuthClientFacade
        def i = 0
        
        //Get oAuth profile name list
        authContainer = testRunner.testCase.testSuite.project.OAuth2ProfileContainer
        oAuthProfilelist = authContainer.getOAuth2ProfileList()
                                    
        oAuthProfilelist.each{
            	                 oAuthProfileName = oAuthProfilelist[i].name
             	            log.info "oAuth Profile name is:  $oAuthProfileName"
         
                              //Get Token Status     
                              oAuthProfile = authContainer.getProfileByName("$oAuthProfileName")
                              TokenStatus = oAuthProfile.accessTokenStatus.toString()
                              log.info "Access Token Status for $oAuthProfileName is:  $TokenStatus"
                                                                            
                              //Get Access Token from the server if expired   
                              if (TokenStatus != 'Retrieved from server'){
                                                                          oAuthClientFacade = new OltuOAuth2ClientFacade().requestAccessToken(oAuthProfile)
                                                                          log.info "Access Token Status is "+ oAuthProfile.accessTokenStatus
                             }  
                             i++
        }

         

         

    • Preerab's avatar
      Preerab
      Occasional Contributor

      Hey,

      I have question on AUTO generating toke on expiration.

      Created discussion https://community.smartbear.com/t5/SoapUI-Pro/how-to-automate-our-manual-Oauth2-0-process/m-p/183496#M41955

      As suggestion I tried implementing 'TestRunListener.beforeRun' with given script and no luck.

      My token have pretty much good expiration, to test auto generation I screw up exisitng token and test them automation. 

      It works when I manually update token (Generate Token)

      READY API 2.6.0

      NOTE: AUTO REFRESH of my token is not set, so I need to create new toke when its expired.

      Any help is highly appreciated.

  • groovyguy's avatar
    groovyguy
    Community Hero

    While I haven't done this myself, I have found usually if I need to do something similar I can usually find a way to access these parts in a groovy script test step using the ReadyAPI api. While that's not a direct answer, you might be able to explore that to at least have something you can put into an event / startup script.