Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
W
webauthn-demo
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Josh Ji
webauthn-demo
Commits
14752a87
Commit
14752a87
authored
Aug 20, 2022
by
Josh Ji
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
加入詢問IDP的流程
parent
6801ea37
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
428 additions
and
365 deletions
+428
-365
.idea/misc.xml
.idea/misc.xml
+3
-0
gaedemo.iml
gaedemo.iml
+0
-11
pom.xml
pom.xml
+8
-1
src/main/java/com/google/webauthn/gaedemo/objects/AttestationObject.java
...om/google/webauthn/gaedemo/objects/AttestationObject.java
+0
-1
src/main/java/com/google/webauthn/gaedemo/objects/AuthenticationExtensionsClientInputs.java
...gaedemo/objects/AuthenticationExtensionsClientInputs.java
+7
-0
src/main/java/com/google/webauthn/gaedemo/servlets/BeginMakeCredential.java
...google/webauthn/gaedemo/servlets/BeginMakeCredential.java
+4
-0
src/main/java/com/google/webauthn/gaedemo/servlets/FinishMakeCredential.java
...oogle/webauthn/gaedemo/servlets/FinishMakeCredential.java
+183
-132
src/main/webapp/WEB-INF/web.xml
src/main/webapp/WEB-INF/web.xml
+220
-220
src/main/webapp/js/webauthn.js
src/main/webapp/js/webauthn.js
+3
-0
No files found.
.idea/misc.xml
View file @
14752a87
...
...
@@ -12,4 +12,7 @@
</option>
</component>
<component
name=
"ProjectRootManager"
version=
"2"
languageLevel=
"JDK_1_8"
default=
"true"
project-jdk-name=
"1.8.0_221"
project-jdk-type=
"JavaSDK"
/>
<component
name=
"ProjectType"
>
<option
name=
"id"
value=
"jpab"
/>
</component>
</project>
\ No newline at end of file
gaedemo.iml
deleted
100644 → 0
View file @
6801ea37
<?xml version="1.0" encoding="UTF-8"?>
<module
version=
"4"
>
<component
name=
"FacetManager"
>
<facet
type=
"google-app-engine"
name=
"Google App Engine"
>
<configuration
/>
</facet>
<facet
type=
"app-engine-standard"
name=
"Google App Engine Standard"
>
<configuration
/>
</facet>
</component>
</module>
\ No newline at end of file
pom.xml
View file @
14752a87
...
...
@@ -7,7 +7,7 @@
<version>
1.0-SNAPSHOT
</version>
<groupId>
com.google.webauthn
</groupId>
<artifactId>
gaedemo
</artifactId>
<artifactId>
webauthn-demo-josh
</artifactId>
<!-- [START set_versions] -->
<properties>
...
...
@@ -26,6 +26,13 @@
<!-- [END set_versions] -->
<dependencies>
<!--Unirest-->
<dependency>
<groupId>
com.konghq
</groupId>
<artifactId>
unirest-java
</artifactId>
<version>
3.13.6
</version>
<classifier>
standalone
</classifier>
</dependency>
<!-- Compile/runtime dependencies -->
<dependency>
<groupId>
com.google.cloud
</groupId>
...
...
src/main/java/com/google/webauthn/gaedemo/objects/AttestationObject.java
View file @
14752a87
...
...
@@ -74,7 +74,6 @@ public class AttestationObject {
case
"attStmt"
:
attStmt
=
attObjMap
.
get
(
key
);
break
;
}
}
}
...
...
src/main/java/com/google/webauthn/gaedemo/objects/AuthenticationExtensionsClientInputs.java
View file @
14752a87
...
...
@@ -86,6 +86,13 @@ public class AuthenticationExtensionsClientInputs {
return
keyPair
;
}
public
void
addPrlabExtension
(){
if
(
registrationExtensions
==
null
)
{
registrationExtensions
=
new
JsonObject
();
}
registrationExtensions
.
addProperty
(
"PRLab"
,
true
);
}
/**
* @return registration extensions.
*/
...
...
src/main/java/com/google/webauthn/gaedemo/servlets/BeginMakeCredential.java
View file @
14752a87
...
...
@@ -108,6 +108,10 @@ public class BeginMakeCredential extends HttpServlet {
storedKeyPair
.
save
(
session
.
getId
());
}
catch
(
Exception
e
)
{}
/* josh start */
extensions
.
addPrlabExtension
();
/* josh end */
optionsJson
.
add
(
"extensions"
,
extensions
.
getRegistrationExtensions
());
response
.
setContentType
(
"application/json"
);
...
...
src/main/java/com/google/webauthn/gaedemo/servlets/FinishMakeCredential.java
View file @
14752a87
...
...
@@ -15,7 +15,11 @@
package
com.google.webauthn.gaedemo.servlets
;
import
java.io.IOException
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.security.KeyPair
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.ServletException
;
...
...
@@ -23,6 +27,9 @@ import javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
co.nstant.in.cbor.CborDecoder
;
import
co.nstant.in.cbor.CborException
;
import
co.nstant.in.cbor.model.*
;
import
com.google.appengine.api.users.UserService
;
import
com.google.appengine.api.users.UserServiceFactory
;
import
com.google.common.base.Splitter
;
...
...
@@ -46,143 +53,187 @@ import com.google.webauthn.gaedemo.server.U2fServer;
import
com.google.webauthn.gaedemo.service.UserProxyService
;
import
com.google.webauthn.gaedemo.storage.CableKeyPair
;
import
com.google.webauthn.gaedemo.storage.Credential
;
import
kong.unirest.HttpResponse
;
import
kong.unirest.Unirest
;
import
org.bouncycastle.util.encoders.HexEncoder
;
import
unirest.shaded.org.apache.commons.codec.binary.Hex
;
public
class
FinishMakeCredential
extends
HttpServlet
{
private
static
final
int
FINGERPRINT
=
2
;
private
static
final
int
SCREEN_LOCK
=
134
;
private
static
final
long
serialVersionUID
=
1L
;
private
final
UserService
userService
=
UserServiceFactory
.
getUserService
();
public
FinishMakeCredential
()
{}
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
doPost
(
request
,
response
);
}
@Override
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
/* Tyler start -----------------*/
UserProxyService
userProxyService
=
UserProxyService
.
getInstance
();
String
currentUser
=
userProxyService
.
getCurrentUser
().
getEmail
();
/* Tyler end -----------------*/
private
static
final
int
FINGERPRINT
=
2
;
private
static
final
int
SCREEN_LOCK
=
134
;
private
static
final
long
serialVersionUID
=
1L
;
private
final
UserService
userService
=
UserServiceFactory
.
getUserService
();
public
FinishMakeCredential
()
{}
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
doPost
(
request
,
response
);
}
@Override
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
/* Tyler start -----------------*/
UserProxyService
userProxyService
=
UserProxyService
.
getInstance
();
String
currentUser
=
userProxyService
.
getCurrentUser
().
getEmail
();
/* Tyler end -----------------*/
/* Original code
String currentUser = userService.getCurrentUser().getEmail();
*/
String
data
=
request
.
getParameter
(
"data"
);
if
(
data
==
null
)
{
data
=
""
;
}
String
session
=
request
.
getParameter
(
"session"
);
if
(
session
==
null
)
{
session
=
""
;
}
String
credentialId
=
null
;
String
type
=
null
;
String
uvm
=
null
;
JsonElement
makeCredentialResponse
=
null
;
CablePairingData
cablePairingData
=
null
;
try
{
JsonObject
json
=
new
JsonParser
().
parse
(
data
).
getAsJsonObject
();
JsonElement
idJson
=
json
.
get
(
"id"
);
if
(
idJson
!=
null
)
{
credentialId
=
idJson
.
getAsString
();
}
JsonElement
typeJson
=
json
.
get
(
"type"
);
if
(
typeJson
!=
null
)
{
type
=
typeJson
.
getAsString
();
}
JsonElement
uvmJson
=
json
.
get
(
"uvm"
);
if
(
uvmJson
!=
null
&&
uvmJson
.
isJsonArray
())
{
JsonArray
uvmArray
=
uvmJson
.
getAsJsonArray
();
if
(
uvmJson
.
isJsonArray
())
{
JsonElement
uvmElement
=
uvmArray
.
get
(
0
);
if
(
uvmElement
!=
null
)
{
switch
(
uvmElement
.
getAsJsonObject
().
get
(
"userVerificationMethod"
).
getAsInt
()){
case
FINGERPRINT:
uvm
=
"Fingerprint"
;
break
;
case
SCREEN_LOCK:
uvm
=
"Screen Lock"
;
break
;
default
:
uvm
=
"Others"
;
break
;
}
}
}
}
makeCredentialResponse
=
json
.
get
(
"response"
);
}
catch
(
IllegalStateException
e
)
{
throw
new
ServletException
(
"Passed data not a json object"
);
}
catch
(
ClassCastException
e
)
{
throw
new
ServletException
(
"Invalid input"
);
}
catch
(
JsonParseException
e
)
{
throw
new
ServletException
(
"Input not valid json"
);
}
AuthenticatorAttestationResponse
attestation
=
null
;
try
{
attestation
=
new
AuthenticatorAttestationResponse
(
makeCredentialResponse
);
}
catch
(
ResponseException
e
)
{
throw
new
ServletException
(
e
);
}
if
(
attestation
.
getAttestationObject
().
getAuthenticatorData
().
hasExtensionData
())
{
Map
<
String
,
AttestationExtension
>
extensionMap
=
attestation
.
getAttestationObject
().
getAuthenticatorData
().
getExtensionData
();
if
(
extensionMap
.
containsKey
(
CableRegistrationData
.
KEY
))
{
CableRegistrationData
cableData
=
(
CableRegistrationData
)
extensionMap
.
get
(
CableRegistrationData
.
KEY
);
// Get key pair generated during the StartMakeCredential operation
KeyPair
sessionKeyPair
=
CableKeyPair
.
get
(
Long
.
valueOf
(
session
));
cablePairingData
=
CablePairingData
.
generatePairingData
(
cableData
,
sessionKeyPair
);
}
}
// Recoding of credential ID is needed, because the ID from HTTP servlet request doesn't support
// padding.
String
credentialIdRecoded
=
BaseEncoding
.
base64Url
().
encode
(
BaseEncoding
.
base64Url
().
decode
(
credentialId
));
PublicKeyCredential
cred
=
new
PublicKeyCredential
(
credentialIdRecoded
,
type
,
BaseEncoding
.
base64Url
().
decode
(
credentialId
),
attestation
);
String
domain
=
(
request
.
isSecure
()
?
"https://"
:
"http://"
)
+
request
.
getHeader
(
"Host"
);
String
rpId
=
Iterables
.
get
(
Splitter
.
on
(
':'
).
split
(
request
.
getHeader
(
"Host"
)),
0
);
switch
(
cred
.
getAttestationType
())
{
case
FIDOU2F:
U2fServer
.
registerCredential
(
cred
,
currentUser
,
session
,
domain
,
rpId
);
break
;
case
ANDROIDSAFETYNET:
AndroidSafetyNetServer
.
registerCredential
(
cred
,
currentUser
,
session
,
rpId
);
break
;
case
PACKED:
PackedServer
.
registerCredential
(
cred
,
currentUser
,
session
,
rpId
);
break
;
case
NONE:
break
;
}
Credential
credential
=
new
Credential
(
cred
);
if
(
cablePairingData
!=
null
)
{
credential
.
setCablePairingData
(
cablePairingData
);
}
credential
.
setUserVerificationMethod
(
uvm
);
credential
.
save
(
currentUser
);
PublicKeyCredentialResponse
rsp
=
new
PublicKeyCredentialResponse
(
true
,
"Successfully created credential"
);
response
.
setContentType
(
"application/json"
);
response
.
getWriter
().
println
(
rsp
.
toJson
());
}
String
data
=
request
.
getParameter
(
"data"
);
if
(
data
==
null
)
{
data
=
""
;
}
System
.
out
.
println
(
data
);
String
session
=
request
.
getParameter
(
"session"
);
if
(
session
==
null
)
{
session
=
""
;
}
String
credentialId
=
null
;
String
type
=
null
;
String
uvm
=
null
;
JsonElement
makeCredentialResponse
=
null
;
CablePairingData
cablePairingData
=
null
;
try
{
JsonObject
json
=
new
JsonParser
().
parse
(
data
).
getAsJsonObject
();
JsonElement
idJson
=
json
.
get
(
"id"
);
if
(
idJson
!=
null
)
{
credentialId
=
idJson
.
getAsString
();
}
JsonElement
typeJson
=
json
.
get
(
"type"
);
if
(
typeJson
!=
null
)
{
type
=
typeJson
.
getAsString
();
}
JsonElement
uvmJson
=
json
.
get
(
"uvm"
);
if
(
uvmJson
!=
null
&&
uvmJson
.
isJsonArray
())
{
JsonArray
uvmArray
=
uvmJson
.
getAsJsonArray
();
if
(
uvmJson
.
isJsonArray
())
{
JsonElement
uvmElement
=
uvmArray
.
get
(
0
);
if
(
uvmElement
!=
null
)
{
switch
(
uvmElement
.
getAsJsonObject
().
get
(
"userVerificationMethod"
).
getAsInt
()){
case
FINGERPRINT:
uvm
=
"Fingerprint"
;
break
;
case
SCREEN_LOCK:
uvm
=
"Screen Lock"
;
break
;
default
:
uvm
=
"Others"
;
break
;
}
}
}
}
makeCredentialResponse
=
json
.
get
(
"response"
);
}
catch
(
IllegalStateException
e
)
{
throw
new
ServletException
(
"Passed data not a json object"
);
}
catch
(
ClassCastException
e
)
{
throw
new
ServletException
(
"Invalid input"
);
}
catch
(
JsonParseException
e
)
{
throw
new
ServletException
(
"Input not valid json"
);
}
AuthenticatorAttestationResponse
attestation
=
null
;
try
{
attestation
=
new
AuthenticatorAttestationResponse
(
makeCredentialResponse
);
}
catch
(
ResponseException
e
)
{
throw
new
ServletException
(
e
);
}
if
(
attestation
.
getAttestationObject
().
getAuthenticatorData
().
hasExtensionData
())
{
Map
<
String
,
AttestationExtension
>
extensionMap
=
attestation
.
getAttestationObject
().
getAuthenticatorData
().
getExtensionData
();
if
(
extensionMap
.
containsKey
(
CableRegistrationData
.
KEY
))
{
CableRegistrationData
cableData
=
(
CableRegistrationData
)
extensionMap
.
get
(
CableRegistrationData
.
KEY
);
// Get key pair generated during the StartMakeCredential operation
KeyPair
sessionKeyPair
=
CableKeyPair
.
get
(
Long
.
valueOf
(
session
));
cablePairingData
=
CablePairingData
.
generatePairingData
(
cableData
,
sessionKeyPair
);
}
}
/* josh start */
if
(
1
==
1
)
{
String
attestationObjectBase64
=
makeCredentialResponse
.
getAsJsonObject
().
get
(
"attestationObject"
).
getAsString
();
System
.
out
.
println
(
"attestationObject base64: "
+
attestationObjectBase64
);
byte
[]
attestationObject
=
BaseEncoding
.
base64
().
decode
(
attestationObjectBase64
);
try
{
co
.
nstant
.
in
.
cbor
.
model
.
Map
attestationObjectCbor
=
(
co
.
nstant
.
in
.
cbor
.
model
.
Map
)
CborDecoder
.
decode
(
attestationObject
).
get
(
0
);
for
(
DataItem
key
:
attestationObjectCbor
.
getKeys
())
System
.
out
.
println
(
key
);
co
.
nstant
.
in
.
cbor
.
model
.
Map
attestationStatement
=
(
co
.
nstant
.
in
.
cbor
.
model
.
Map
)
attestationObjectCbor
.
get
(
new
UnicodeString
(
"attStmt"
));
for
(
DataItem
key
:
attestationStatement
.
getKeys
())
System
.
out
.
println
(
key
);
List
<
DataItem
>
extensions
=
((
Array
)
attestationStatement
.
get
(
new
UnicodeString
(
"extensions"
))).
getDataItems
();
for
(
DataItem
item
:
extensions
)
System
.
out
.
println
(
item
);
byte
[][]
extensionSendsOut
=
new
byte
[
2
][];
extensionSendsOut
[
0
]
=
((
ByteString
)
extensions
.
get
(
0
)).
getBytes
();
extensionSendsOut
[
1
]
=
((
ByteString
)
extensions
.
get
(
1
)).
getBytes
();
for
(
byte
[]
bytes
:
extensionSendsOut
)
System
.
out
.
println
(
Hex
.
encodeHexString
(
bytes
));
String
p1
=
BaseEncoding
.
base64
().
encode
(
extensionSendsOut
[
0
]);
// param 1 : hmac
String
p2
=
BaseEncoding
.
base64
().
encode
(
extensionSendsOut
[
1
]);
// param 2 : Cx
HttpResponse
<
String
>
httpResponse
=
Unirest
.
post
(
"http://localhost:8086/api/idp/askIdentity"
)
.
header
(
"Content-Type"
,
"application/json"
)
.
body
(
"{\"p1\":\""
+
p1
+
"\",\"p2\":\""
+
p2
+
"\"}"
)
.
asString
();
System
.
out
.
println
(
httpResponse
.
getBody
());
}
catch
(
CborException
e
)
{
e
.
printStackTrace
();
}
}
/* josh end */
// Recoding of credential ID is needed, because the ID from HTTP servlet request doesn't support
// padding.
String
credentialIdRecoded
=
BaseEncoding
.
base64Url
().
encode
(
BaseEncoding
.
base64Url
().
decode
(
credentialId
));
PublicKeyCredential
cred
=
new
PublicKeyCredential
(
credentialIdRecoded
,
type
,
BaseEncoding
.
base64Url
().
decode
(
credentialId
),
attestation
);
String
domain
=
(
request
.
isSecure
()
?
"https://"
:
"http://"
)
+
request
.
getHeader
(
"Host"
);
String
rpId
=
Iterables
.
get
(
Splitter
.
on
(
':'
).
split
(
request
.
getHeader
(
"Host"
)),
0
);
switch
(
cred
.
getAttestationType
())
{
case
FIDOU2F:
U2fServer
.
registerCredential
(
cred
,
currentUser
,
session
,
domain
,
rpId
);
break
;
case
ANDROIDSAFETYNET:
AndroidSafetyNetServer
.
registerCredential
(
cred
,
currentUser
,
session
,
rpId
);
break
;
case
PACKED:
// PackedServer.registerCredential(cred, currentUser, session, rpId); //
break
;
case
NONE:
break
;
}
Credential
credential
=
new
Credential
(
cred
);
if
(
cablePairingData
!=
null
)
{
credential
.
setCablePairingData
(
cablePairingData
);
}
credential
.
setUserVerificationMethod
(
uvm
);
credential
.
save
(
currentUser
);
PublicKeyCredentialResponse
rsp
=
new
PublicKeyCredentialResponse
(
true
,
"Successfully created credential"
);
response
.
setContentType
(
"application/json"
);
response
.
getWriter
().
println
(
rsp
.
toJson
());
}
}
src/main/webapp/WEB-INF/web.xml
View file @
14752a87
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns=
"http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version=
"2.5"
>
<welcome-file-list>
<welcome-file>
Home
</welcome-file>
</welcome-file-list>
<filter>
<filter-name>
ObjectifyFilter
</filter-name>
<filter-class>
com.googlecode.objectify.ObjectifyFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>
ObjectifyFilter
</filter-name>
<url-pattern>
/*
</url-pattern>
</filter-mapping>
<listener>
<listener-class>
com.google.webauthn.gaedemo.server.OfyHelper
</listener-class>
</listener>
xsi:schemaLocation=
"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version=
"2.5"
>
<welcome-file-list>
<welcome-file>
Home
</welcome-file>
</welcome-file-list>
<filter>
<filter-name>
ObjectifyFilter
</filter-name>
<filter-class>
com.googlecode.objectify.ObjectifyFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>
ObjectifyFilter
</filter-name>
<url-pattern>
/*
</url-pattern>
</filter-mapping>
<listener>
<listener-class>
com.google.webauthn.gaedemo.server.OfyHelper
</listener-class>
</listener>
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <web-resource-name>assetlinks</web-resource-name>-->
<!-- <url-pattern>/.well-known/*</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <!– OMIT auth-constraint –>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <web-resource-name>cron</web-resource-name>-->
<!-- <url-pattern>/DeleteOldSessions</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <auth-constraint>-->
<!-- <role-name>admin</role-name>-->
<!-- </auth-constraint>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <web-resource-name>assetlinks</web-resource-name>-->
<!-- <url-pattern>/.well-known/*</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <!– OMIT auth-constraint –>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <web-resource-name>cron</web-resource-name>-->
<!-- <url-pattern>/DeleteOldSessions</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <auth-constraint>-->
<!-- <role-name>admin</role-name>-->
<!-- </auth-constraint>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <url-pattern>/_ah/api/*</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <user-data-constraint>-->
<!-- <transport-guarantee>CONFIDENTIAL</transport-guarantee>-->
<!-- </user-data-constraint>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <url-pattern>/_ah/api/*</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <user-data-constraint>-->
<!-- <transport-guarantee>CONFIDENTIAL</transport-guarantee>-->
<!-- </user-data-constraint>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <web-resource-name>all-others</web-resource-name>-->
<!-- <url-pattern>/*</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <auth-constraint>-->
<!-- <role-name>*</role-name>-->
<!-- </auth-constraint>-->
<!-- <user-data-constraint>-->
<!-- <transport-guarantee>CONFIDENTIAL</transport-guarantee>-->
<!-- </user-data-constraint>-->
<!-- </security-constraint>-->
<!-- <security-constraint>-->
<!-- <web-resource-collection>-->
<!-- <web-resource-name>all-others</web-resource-name>-->
<!-- <url-pattern>/*</url-pattern>-->
<!-- </web-resource-collection>-->
<!-- <auth-constraint>-->
<!-- <role-name>*</role-name>-->
<!-- </auth-constraint>-->
<!-- <user-data-constraint>-->
<!-- <transport-guarantee>CONFIDENTIAL</transport-guarantee>-->
<!-- </user-data-constraint>-->
<!-- </security-constraint>-->
<context-param>
<param-name>
name
</param-name>
<param-value>
webauthn-demo
</param-value>
</context-param>
<servlet>
<description></description
>
<display-name>
FinishMakeCredential
</display-name>
<servlet-name>
FinishMakeCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.FinishMakeCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
FinishMakeCredential
</servlet-name>
<url-pattern>
/FinishMakeCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
BeginMakeCredential
</display-name>
<servlet-name>
BeginMakeCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.BeginMakeCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
BeginMakeCredential
</servlet-name>
<url-pattern>
/BeginMakeCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
BeginGetAssertion
</display-name>
<servlet-name>
BeginGetAssertion
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.BeginGetAssertion
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
BeginGetAssertion
</servlet-name>
<url-pattern>
/BeginGetAssertion
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
RegisteredKeys
</display-name>
<servlet-name>
RegisteredKeys
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.RegisteredKeys
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
RegisteredKeys
</servlet-name>
<url-pattern>
/RegisteredKeys
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
RemoveCredential
</display-name>
<servlet-name>
RemoveCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.RemoveCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
RemoveCredential
</servlet-name>
<url-pattern>
/RemoveCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
UpdateCredential
</display-name>
<servlet-name>
UpdateCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.UpdateCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
UpdateCredential
</servlet-name>
<url-pattern>
/UpdateCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
Home
</display-name>
<servlet-name>
Home
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.Home
</servlet-class>
</servlet>
<servlet>
<description></description
>
<display-name>
Cable
</display-name>
<servlet-name>
Cable
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.Cable
</servlet-class>
</servlet>
<servlet>
<description></description
>
<display-name>
Login
</display-name>
<servlet-name>
Login
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.Login
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
Home
</servlet-name>
<url-pattern>
/Home
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
Cable
</servlet-name>
<url-pattern>
/Cable
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
Login
</servlet-name>
<url-pattern>
/Login
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
FinishGetAssertion
</display-name>
<servlet-name>
FinishGetAssertion
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.FinishGetAssertion
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
FinishGetAssertion
</servlet-name>
<url-pattern>
/FinishGetAssertion
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
CreateSession
</display-name>
<servlet-name>
CreateSession
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.CreateSession
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
CreateSession
</servlet-name>
<url-pattern>
/CreateSession
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
GetSession
</display-name>
<servlet-name>
GetSession
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.GetSession
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
GetSession
</servlet-name>
<url-pattern>
/GetSession
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
SaveCredential
</display-name>
<servlet-name>
SaveCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.SaveCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
SaveCredential
</servlet-name>
<url-pattern>
/SaveCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description></description
>
<display-name>
DeleteOldSessions
</display-name>
<servlet-name>
DeleteOldSessions
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.DeleteOldSessions
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
DeleteOldSessions
</servlet-name>
<url-pattern>
/DeleteOldSessions
</url-pattern>
</servlet-mapping>
<context-param>
<param-name>
name
</param-name>
<param-value>
webauthn-demo
</param-value>
</context-param>
<servlet>
<description/
>
<display-name>
FinishMakeCredential
</display-name>
<servlet-name>
FinishMakeCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.FinishMakeCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
FinishMakeCredential
</servlet-name>
<url-pattern>
/FinishMakeCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
BeginMakeCredential
</display-name>
<servlet-name>
BeginMakeCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.BeginMakeCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
BeginMakeCredential
</servlet-name>
<url-pattern>
/BeginMakeCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
BeginGetAssertion
</display-name>
<servlet-name>
BeginGetAssertion
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.BeginGetAssertion
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
BeginGetAssertion
</servlet-name>
<url-pattern>
/BeginGetAssertion
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
RegisteredKeys
</display-name>
<servlet-name>
RegisteredKeys
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.RegisteredKeys
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
RegisteredKeys
</servlet-name>
<url-pattern>
/RegisteredKeys
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
RemoveCredential
</display-name>
<servlet-name>
RemoveCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.RemoveCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
RemoveCredential
</servlet-name>
<url-pattern>
/RemoveCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
UpdateCredential
</display-name>
<servlet-name>
UpdateCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.UpdateCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
UpdateCredential
</servlet-name>
<url-pattern>
/UpdateCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
Home
</display-name>
<servlet-name>
Home
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.Home
</servlet-class>
</servlet>
<servlet>
<description/
>
<display-name>
Cable
</display-name>
<servlet-name>
Cable
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.Cable
</servlet-class>
</servlet>
<servlet>
<description/
>
<display-name>
Login
</display-name>
<servlet-name>
Login
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.Login
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
Home
</servlet-name>
<url-pattern>
/Home
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
Cable
</servlet-name>
<url-pattern>
/Cable
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
Login
</servlet-name>
<url-pattern>
/Login
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
FinishGetAssertion
</display-name>
<servlet-name>
FinishGetAssertion
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.FinishGetAssertion
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
FinishGetAssertion
</servlet-name>
<url-pattern>
/FinishGetAssertion
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
CreateSession
</display-name>
<servlet-name>
CreateSession
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.CreateSession
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
CreateSession
</servlet-name>
<url-pattern>
/CreateSession
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
GetSession
</display-name>
<servlet-name>
GetSession
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.GetSession
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
GetSession
</servlet-name>
<url-pattern>
/GetSession
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
SaveCredential
</display-name>
<servlet-name>
SaveCredential
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.SaveCredential
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
SaveCredential
</servlet-name>
<url-pattern>
/SaveCredential
</url-pattern>
</servlet-mapping>
<servlet>
<description/
>
<display-name>
DeleteOldSessions
</display-name>
<servlet-name>
DeleteOldSessions
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.DeleteOldSessions
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
DeleteOldSessions
</servlet-name>
<url-pattern>
/DeleteOldSessions
</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>
EndpointsServlet
</servlet-name>
<servlet-class>
com.google.api.server.spi.EndpointsServlet
</servlet-class>
<init-param>
<param-name>
services
</param-name>
<param-value>
com.google.webauthn.gaedemo.endpoints.Fido2RequestHandler
</param-value>
</init-param>
<init-param>
<param-name>
restricted
</param-name>
<param-value>
false
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>
EndpointsServlet
</servlet-name>
<url-pattern>
/_ah/api/*
</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>
AssetLinks
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.AssetLinksHttpServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
AssetLinks
</servlet-name>
<url-pattern>
/.well-known/assetlinks.json
</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>
EndpointsServlet
</servlet-name>
<servlet-class>
com.google.api.server.spi.EndpointsServlet
</servlet-class>
<init-param>
<param-name>
services
</param-name>
<param-value>
com.google.webauthn.gaedemo.endpoints.Fido2RequestHandler
</param-value>
</init-param>
<init-param>
<param-name>
restricted
</param-name>
<param-value>
false
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>
EndpointsServlet
</servlet-name>
<url-pattern>
/_ah/api/*
</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>
AssetLinks
</servlet-name>
<servlet-class>
com.google.webauthn.gaedemo.servlets.AssetLinksHttpServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
AssetLinks
</servlet-name>
<url-pattern>
/.well-known/assetlinks.json
</url-pattern>
</servlet-mapping>
</web-app>
src/main/webapp/js/webauthn.js
View file @
14752a87
...
...
@@ -96,6 +96,7 @@ function _fetch(url, obj) {
function
fetchCredentials
()
{
_fetch
(
'
/RegisteredKeys
'
).
then
(
response
=>
{
let
credentials
=
''
;
console
.
log
(
response
);
for
(
let
i
in
response
)
{
let
{
handle
,
base64handle
,
publicKey
,
name
,
date
,
id
,
transports
,
userVerificationMethod
}
=
response
[
i
];
const
trimmedHandle
=
base64handle
.
replace
(
/=/g
,
''
);
...
...
@@ -448,6 +449,8 @@ function getAssertion() {
const
requestOptions
=
{};
_parameters
=
parameters
;
console
.
log
(
parameters
)
requestOptions
.
challenge
=
strToBin
(
parameters
.
challenge
);
if
(
$
(
'
#customTimeout
'
).
value
!=
''
)
{
requestOptions
.
timeout
=
$
(
'
#customTimeout
'
).
value
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment