Skip to content

Instantly share code, notes, and snippets.

@sbose78
Created October 12, 2017 21:11
Show Gist options
  • Select an option

  • Save sbose78/fc0a7d364f7d7bd9cab1bc10f8f0b915 to your computer and use it in GitHub Desktop.

Select an option

Save sbose78/fc0a7d364f7d7bd9cab1bc10f8f0b915 to your computer and use it in GitHub Desktop.
// Retrieve fetches the stored external provider token.
func (c *TokenController) Retrieve(ctx *app.RetrieveTokenContext) error {
/* currentIdentity, err := login.ContextIdentity(ctx)
if err != nil {
return jsonapi.JSONErrorResponse(ctx, goa.ErrUnauthorized(err.Error()))
}
*/
tokenString := goajwt.ContextJWT(ctx).Raw
if ctx.For == "" {
return jsonapi.JSONErrorResponse(ctx, errors.NewBadParameterError("for", "").Expected("github or openshift-v3 resource"))
}
// TODO: use linkService.NewOauthProvider() to get GitHubConfig or OpenShiftConfig
externalProviderConfig, error := provider.GetExternalProvider(ctx.For)
if error != nil {
return jsonapi.JSONErrorResponse(ctx, error)
}
providerName := externalProviderConfig.Type
// should expect clients to not use the 'scope' parameter.
// if they use something which doesn't match the default, we shall return the usual 401 response
scope := ctx.Scope
if scope == nil || *scope == "" {
scope = &externalProviderConfig.DefaultScope
}
keycloakTokenResponse, err := c.keycloakExternalTokenServiceClient.Get(ctx, tokenString, c.getKeycloakExternalTokenURL(providerName))
if err != nil {
return jsonapi.JSONErrorResponse(ctx, err)
}
ctx.ResponseData.Header().Set("Content-Type", "application/json")
if providerName == "github" {
return ctx.OK(keycloak.ToParameterString(*keycloakTokenResponse))
}
jsonStringResponse, err := keycloak.ToJSONString(*keycloakTokenResponse)
if err != nil {
return jsonapi.JSONErrorResponse(ctx, err)
}
return ctx.OK(jsonStringResponse)
/* TO BE USED AFTER NEW LINKING IS ROLLED OUT
// TODO: use application.transactional when linkService is merged.
externalProviderTokens, err := c.externalProviderTokenRepository.LoadByProviderIDAndIdentityID(ctx, externalProviderConfig.ID, *currentIdentity)
if len(externalProviderTokens) > 0 {
//TODO: move transformation to a different method.
ID := externalProviderTokens[0].ID.String()
return ctx.OK(&app.ExternalToken{
Data: &app.ExternalTokenData{
Attributes: &app.ExternalTokenDataAttributes{
CreatedAt: &externalProviderTokens[0].CreatedAt,
For: ctx.For,
IdentityID: currentIdentity.String(),
Scope: externalProviderTokens[0].Scope,
UpdatedAt: &externalProviderTokens[0].UpdatedAt,
Token: externalProviderTokens[0].Token,
},
Type: "external_provider_token",
ID: &ID,
},
})
}
redirect := ctx.RequestData.Referer()
linkURL := rest.AbsoluteURL(ctx.RequestData, "/api/link?redirect="+redirect+"&scope="+*scope)
errorResponse := fmt.Sprintf("LINK provider=%s, url=%s, description=”%s”", providerName, linkURL, "Link account")
ctx.ResponseData.Header().Set("WWW-Authenticate", errorResponse)
return jsonapi.JSONErrorResponse(ctx, errors.NewUnauthorizedError(errorResponse))
*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment