...
1
21
22 package openid
23
24 import (
25 "context"
26
27 "github.com/ory/x/errorsx"
28
29 "github.com/ory/fosite"
30 "github.com/ory/fosite/handler/oauth2"
31 "github.com/ory/fosite/token/jwt"
32 )
33
34 type OpenIDConnectImplicitHandler struct {
35 AuthorizeImplicitGrantTypeHandler *oauth2.AuthorizeImplicitGrantTypeHandler
36 *IDTokenHandleHelper
37 ScopeStrategy fosite.ScopeStrategy
38 OpenIDConnectRequestValidator *OpenIDConnectRequestValidator
39
40 RS256JWTStrategy *jwt.RS256JWTStrategy
41
42 MinParameterEntropy int
43 }
44
45 func (c *OpenIDConnectImplicitHandler) HandleAuthorizeEndpointRequest(ctx context.Context, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) error {
46 if !(ar.GetGrantedScopes().Has("openid") && (ar.GetResponseTypes().Has("token", "id_token") || ar.GetResponseTypes().ExactOne("id_token"))) {
47 return nil
48 } else if ar.GetResponseTypes().Has("code") {
49
50 return nil
51 }
52
53 ar.SetDefaultResponseMode(fosite.ResponseModeFragment)
54
55 if !ar.GetClient().GetGrantTypes().Has("implicit") {
56 return errorsx.WithStack(fosite.ErrInvalidGrant.WithHint("The OAuth 2.0 Client is not allowed to use the authorization grant 'implicit'."))
57 }
58
59
60
61
62
63
64
65
66 if nonce := ar.GetRequestForm().Get("nonce"); len(nonce) == 0 {
67 return errorsx.WithStack(fosite.ErrInvalidRequest.WithHint("Parameter 'nonce' must be set when using the OpenID Connect Implicit Flow."))
68 } else if len(nonce) < c.MinParameterEntropy {
69 return errorsx.WithStack(fosite.ErrInsufficientEntropy.WithHintf("Parameter 'nonce' is set but does not satisfy the minimum entropy of %d characters.", c.MinParameterEntropy))
70 }
71
72 client := ar.GetClient()
73 for _, scope := range ar.GetRequestedScopes() {
74 if !c.ScopeStrategy(client.GetScopes(), scope) {
75 return errorsx.WithStack(fosite.ErrInvalidScope.WithHintf("The OAuth 2.0 Client is not allowed to request scope '%s'.", scope))
76 }
77 }
78
79 sess, ok := ar.GetSession().(Session)
80 if !ok {
81 return errorsx.WithStack(ErrInvalidSession)
82 }
83
84 if err := c.OpenIDConnectRequestValidator.ValidatePrompt(ctx, ar); err != nil {
85 return err
86 }
87
88 claims := sess.IDTokenClaims()
89 if ar.GetResponseTypes().Has("token") {
90 if err := c.AuthorizeImplicitGrantTypeHandler.IssueImplicitAccessToken(ctx, ar, resp); err != nil {
91 return errorsx.WithStack(err)
92 }
93
94 ar.SetResponseTypeHandled("token")
95 hash, err := c.ComputeHash(ctx, sess, resp.GetParameters().Get("access_token"))
96 if err != nil {
97 return err
98 }
99
100 claims.AccessTokenHash = hash
101 } else {
102 resp.AddParameter("state", ar.GetState())
103 }
104
105 if err := c.IssueImplicitIDToken(ctx, ar, resp); err != nil {
106 return errorsx.WithStack(err)
107 }
108
109
110
111
112 ar.SetResponseTypeHandled("id_token")
113 return nil
114 }
115
View as plain text